2012-04-18 4 views
4

Мэтт Хэмилтон рассказал мне интересный факт о WPF: в версии 4.5 возможно связывание в двухстороннем режиме со статической переменной. К сожалению, V4.5 ist еще бета-версия, я решил изменить свой код, чтобы мое приложение, наконец, работало правильно.Двусторонняя привязка в WPF не работает со статическими элементами

Но - все-таки у меня есть подобные проблемы, здесь мы идем:

У меня есть очень простой «RecallConnectionSettings» класса. Этот элемент этого класса должен быть доступен везде в коде, так что я решил сделать их статическими (как это):

public class RecallConnectionSettings 
    { 
      private static string Server {get;set;} 
    } 

Как вы можете видеть: есть только одна переменная «Сервер». Теперь я хочу сделать привязку 2WayMode от текстового свойства TextBox к этому значению «Server».

Так что я попытался это:

<UserControl....> 
    <UserControl.Resources> 
      <local:RecallConnectionSettings x:Key="recallConf"/> 
    </UserControl.Resources> 
    <TextBox Text="{Binding Source={StaticResource recallConf}, Path=Server, 
Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" ... Name="txtServerAdress" /> 
</UserControl> 

Это прекрасно работает, когда я изменить значение в текстовом поле - но не с другой стороны. Если я изменил значение «Server» (вручную), текстовое свойство в моем текстовом поле не будет обновляться.

Конечно, нет - как я теперь знаю, мне нужно реализовать INotifyProperty в моем классе RecallConnectionSettings. Тогда это выглядит следующим образом:

public class RecallConnectionSettings : INotifyPropertyChanged 
    { 
    public event PropertyChangedEventHandler PropertyChanged; 
    private static string s_server; 

    public static string Server 
      { 
       get { return s_server; } 
       set 
       { 
        s_server = value; 
        OnPropertyChanged("Server"); 
       } 
      } 

public static event PropertyChangedEventHandler PropertyChanged; 



protected static void OnPropertyChanged(string name) 
      { 
       PropertyChangedEventHandler handler = PropertyChanged; 
       if (handler != null) 
       { 
        PropertyChanged(this, new PropertyChangedEventArgs(name)); 
       } 
      } 
    } 

Ну - это не может работать тоже. Потому что есть только статические методы, я не могу использовать экземпляр класса для вызова события:

PropertyChanged(this, new PropertyChangedEventArgs(name)); 

Итак - что теперь делать? Я думал об использовании одиночки, так что я сделал это:

public class RecallConnectionSettings : INotifyPropertyChanged 
    { 
     private static RecallConnectionSettings instance; 

     private RecallConnectionSettings(){} 

     public static RecallConnectionSettings Instance 
     { 
      get 
      { 
       if(instance == null) 
       { 
        instance = new RecallConnectionSettings(); 
       } 
       return instance; 
      } 
     } 
// ... here comes the other stuff 
} 

Чтобы заставить его работать, я также должен подготовить свой UserControl, так что я сделал это:

...  
<UserControl.DataContext> 
      <local:RecallConnectionSettings/> 
</UserControl.DataContext> 
... 

На данный момент существует нет необходимости продолжать попытки, потому что для этого конструктор по умолчанию должен быть общедоступным.

Независимо от того, что я делаю: это не работает. Мне кажется, что я до сих пор не понимаю, как это работает - вы были бы такими добрыми и показали бы мне трюк?

+2

не выводите из INotifyPropertyChanged? – stijn

+0

Выполняет ли вывод «вывод - отладка» в VS? Вы активировали отладку в своей привязке? как @stijn сказал, вам нужно извлечь из INotifyPropertyChanged –

+0

Черт - вы правы .. Я попробую еще раз. спасибо. – CodeCannibal

ответ

2

Держите решение одноплодного и заменить это:

...  
<UserControl> 
    <UserControl.DataContext> 
     <local:RecallConnectionSettings/> 
    </UserControl.DataContext> 
    ... 
</UserControl> 
... 

К этому:

...  
<UserControl DataContext="{x:Static local:RecallConnectionSettings.Instance}"> 
    ... 
</UserControl> 
... 
+0

Экземпляр не распознается ... – user1034912

0

WOW - благодаря Николасу, который работает!

Для других читателей - вот что вам нужно код для текстового поля теперь:

<TextBox Text="{Binding Path=Server, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Name="txtServerAdresse"/> 
+0

не работает, данные не обновляются при изменении – user1034912

 Смежные вопросы

  • Нет связанных вопросов^_^