INotifyPropertyChanged WPF
Какова цель INotifyPropertyChanged. Я знаю, что это событие запускается всякий раз, когда свойство изменяется, но как может View / UI знать, что это событие запущено:
Вот мой class Customer, который реализует событие INotifyPropertyChanged:
public class Customer : INotifyPropertyChanged { private string _firstName; public string LastName { get; set; } public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged(string propertyName) { if(PropertyChanged != null) PropertyChanged(this,new PropertyChangedEventArgs(propertyName)); } public string FirstName { get { return _firstName; } set { _firstName = value; OnPropertyChanged("FirstName"); } } }
Но теперь, как уведомить пользовательский интерфейс, что свойство изменилось. Например, когда пользователь присваивает пустое или пустое имя первому имени, как я могу отображать MessageBox в пользовательском интерфейсе.
- Неправильно ли использовать Диспетчер в моей модели ViewModel?
- Как обновить GUI с помощью фонового рабочего?
- Этот тип CollectionView не поддерживает изменения в SourceCollection из streamа, отличного от streamа Dispatcher
- Как вы определяете, использует ли WPF аппаратное или программное обеспечение?
- отображать Песочные часы, когда приложение занято
- ElementName привязка из MenuItem в ContextMenu
- В чем разница между Width и ActualWidth в WPF?
- Связывающие элементыСвойства ComboBoxColumn в WPF DataGrid
- WPF TextBox Validation C #
- Как сделать все элементы управления пропорционально пропорционально изменяемыми, когда окно максимизируется?
- Связывающие свойства в коде
- Как определить номер недели определенной даты?
- Добавить информацию о форме в ListView, когда она создана
INotifyPropertyChanged позволяет элементам интерфейса WPF (через стандартные механизмы привязки данных) подписываться на событие PropertyChanged и автоматически обновлять себя. Например, если у вас есть TextBlock, отображающий ваше свойство FirstName, используя INotifyPropertyChanged, вы можете отобразить его в форме и он будет автоматически оставаться в курсе, когда свойство FirstName изменяется в коде.
«Вид» только подписывается на событие, которое сообщает ему все необходимое. Событие включает имя измененного свойства, поэтому, если элемент пользовательского интерфейса привязан к этому свойству, он обновляется.
WPF может знать, потому что он может проверить, реализует ли объект этот интерфейс, затем отбрасывает объект в указанный интерфейс и регистрирует событие. Затем он может инициировать переплетную инфраструктуру для обновления дисплея. Если вы тоже хотите отреагировать, вы можете зарегистрироваться для участия в одном и том же мероприятии.
EDIT: Я перечитываю ваш вопрос и некоторые ваши комментарии. Это возможное решение, использующее событие DataContextChanged и интерфейс INotifyPropertyChanged на объекте Customer. Вы также должны изучить Валидацию привязки данных в WPF и .Net 3.5.
// assuming: // myWindow.DataContext = new Customer(); myWindow.DataContextChanged += MyWindow_DataContextChanged; private void MyWindow_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e) { var oldCustomer = e.OldValue as Customer; if (oldCustomer != null) { oldCustomer.PropertyChanged -= Customer_CheckProps; } var newCustomer = e.NewValue as Customer; if (newCustomer != null) { newCustomer.PropertyChanged += Customer_CheckProps; } } private void Customer_CheckProps(object sender, PropertyChangedEventArgs e) { var customer = sender as Customer; if (customer != null) { if (e.PropertyName == "FirstName" && String.IsNullOrEmpty(customer.FirstName)) { // Display Message Box } } }