Кнопка привязки.Доступ к свойству в источнике данных текстового поля

#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 свойства.