2015-01-27 4 views
-1

Я реализовал привязку данных WPF с помощью метода INotifyPropertyChanged.WPF: лучший способ блокировать OnPropertyChanged

public class ExportNode : INotifyPropertyChanged 
{ 
    public uint Handle { get; set; } 
    public String Text { get; set; } 
    private bool _ischecked; 
    public bool IsChecked 
    { 
     get 
     { 
      return _ischecked; 
     } 
     set 
     { 
      _ischecked = value; 
      OnPropertyChanged("IsChecked"); 

     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    // Create the OnPropertyChanged method to raise the event 
    protected void OnPropertyChanged(string name) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(name)); 
     } 
    } 
} 

И чем подписаться на события формируют свой код, так что всякий раз, когда я изменить свойство в пользовательском интерфейсе, он запускает функцию обратного вызова. Но теперь я пытаюсь найти лучший способ изменить свойство из кода, а не обращать обратный вызов, просто обновить интерфейс.

 void newNode_PropertyChanged(object sender, PropertyChangedEventArgs e) 
     { 
      if (e.PropertyName == "IsChecked") 
      { 
      } 
     } 

На данный момент я просто подумал о реализации некоторых «блокирующие» свойства члена в ExportNode

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

или удалить экземпляр формы событий до изменения.

   newNode.PropertyChanged -= newNode_PropertyChanged; 
       newNode.IsChecked = true; 
       newNode.PropertyChanged += newNode_PropertyChanged; 

Но есть ли лучший способ? Я просто не понимаю некоторых основ? :-)

Большое спасибо

Roman

ответ

3

Вы получили это немного назад.

INotifyPropertyChanged, и, таким образом, PropertyChanged события, является, что делает обновление пользовательского интерфейса, на самом деле, его, что делает всю обязательную работу системы.

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

set 
    { 
     _ischecked = value; 
     OnPropertyChanged("IsChecked"); 

     if (!Blocked) 
      MyOtherMethod(); 
    } 

Обратите внимание, что если вы имеете дело с потоками, что Blocked условием является опасность синхронизации основных.

Если вы действительно нужно регистрироваться для PropertyChanged из кода, то вам лучше просто разрегистрировать с -=. Таким образом, пользовательский интерфейс все еще получает свое событие, но вы этого не делаете.

+0

О, спасибо за разъяснение. Я думаю, мне нужно больше спать :-) – zwadar

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