Мэтт Хэмилтон рассказал мне интересный факт о 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>
...
На данный момент существует нет необходимости продолжать попытки, потому что для этого конструктор по умолчанию должен быть общедоступным.
Независимо от того, что я делаю: это не работает. Мне кажется, что я до сих пор не понимаю, как это работает - вы были бы такими добрыми и показали бы мне трюк?
не выводите из INotifyPropertyChanged? – stijn
Выполняет ли вывод «вывод - отладка» в VS? Вы активировали отладку в своей привязке? как @stijn сказал, вам нужно извлечь из INotifyPropertyChanged –
Черт - вы правы .. Я попробую еще раз. спасибо. – CodeCannibal