#wpf #xaml #data-binding #binding
#wpf #xaml #привязка данных #привязка
Вопрос:
У меня есть Foo
класс:
public class Foo
{
public string Value { get; set; }
public string IsDirty { get; private set; }
}
и у меня есть xaml с TextBox
Button
привязкой к Foo
:
<TextBox Text="{Binding Value, UpdateSourceTrigger=PropertyChanged}" ... />
<Button IsEnabled="{Binding IsDirty}" ... />
Как только текст в TextBox
изменяется (обновляется KeyDown
), Foo.IsDirty
становится истинным (до тех пор, пока не будет нажата кнопка сохранения).
Прямо сейчас, Button.IsEnabled
не меняется при Foo.IsDirty
изменениях.
Как я могу изменить привязку к Button
так, чтобы она стала включена, как только Foo.IsDirty = true
и наоборот?
Спасибо!
Ответ №1:
Вам необходимо реализовать интерфейс INotifyPropertyChanged в вашем классе Foo:
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}
private bool _isDirty;
public bool IsDirty { get{ return _isDirty;}
private set{
_isDirty= value;
OnPropertyChanged("IsDirty"); }
}
Комментарии:
1. Я беспокоился, что это может быть проблемой. К сожалению, класс Foo расширяет класс, который является частью фреймворка, который я не могу изменить (а IsDirty является частью фреймворка), поэтому, если это свойство не уведомляет, я думаю, мне придется придумать что-то еще. Спасибо!
2. Почему бы не создать класс, который расширяется от вашего базового класса и
INotifyPropertyChange
, иFoo
наследовать от него?3. Если вы можете обновить код установщика
Value
свойства, то вы можете создатьOnPropertyChanged("IsDirty");
его в этом установщикеValue
свойства.