如何正确订阅另一个类的PropertyChange事件?

如何正确订阅另一个类的PropertyChange事件?

问题描述:

我正在尝试将视图中的CheckBox绑定到ViewModel中的属性。我正在尝试订阅各个ViewModel属性的更改。如何正确订阅另一个类的PropertyChange事件?

我在我的自定义类上实现了INotifyPropertyChanged,但是我的处理程序方法从未被调用过。

我已经包含了View(XAML),ViewModel和自定义用户类的基本示例。

视图模型

public class HomeViewModel: ViewModelBase 
{ 
    public HomeViewModel() 
    { 
     this.selectedUser = new usersVM();  
     this.selectedUser.PropertyChanged += propChangedHandler; 
    } 

    private void propChangedHandler(object sender, PropertyChangedEventArgs e) 
    { 
     if (e.PropertyName == "superuser") // <-- breakpoint here 
     { 

     } 
    } 

     private usersVM _selectedUser; 
     public usersVM selectedUser 
     { 
      get { return this._selectedUser; } 
      set 
      { 
       if (this._selectedUser != value) 
       { 
        this._selectedUser = value; 
        this.RaisePropertyChanged("selectedUser"); 
       } 
      } 
     } 
} 

自定义用户类

public class usersVM : INotifyPropertyChanged 
{ 
    public usersVM() 
    { 
     this.hasChanges = false; 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    private void NotifyPropertyChanged(String propertyName) 
    { 
     var handler = PropertyChanged; 
     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

    private int _superuser; 
    public int superuser 
    { 
     get 
     { 
      return this._superuser; 
     } 

     set 
     { 
      if (value != this._superuser) 
      { 
       this._superuser = value; 
       NotifyPropertyChanged("username"); 
      } 
     } 
    } 

XAML#

<CheckBox Margin="0,0,8,0" Content="SuperUser" IsChecked="{Binding superuser}" DataContext="{Binding selectedUser}" /> 

我有我的哈德勒方法断点尝试在事件被处理,验证,但这从来没有被称为。

如何正确实现INotifyPropertyChanged并在我的ViewModel中订阅这些事件?

+0

你在说什么?您的usersVM类中甚至没有“enabled”属性。请注意,在selectedUser属性设置器中,您应该从旧属性值中分离propChangedHandler并将其附加到新属性中。 – Clemens

+0

修正了这个错误。你能分享一个你在这里描述的例子吗? –

+1

为什么superUser是'int'而不是'bool'?对于PropertyChangedHandler,你有'this.selectedUser.PropertyChanged + = propChangedHandler'。现在想象一下,当你给'selectedUser'分配一个新值时会发生什么。 – Clemens

断开与当前selectedUser值PropertyChanged事件处理程序,并将其附加到新的一个是这样的:

private usersVM _selectedUser; 
public usersVM selectedUser 
{ 
    get { return _selectedUser; } 
    set 
    { 
     if (_selectedUser != value) 
     { 
      if (_selectedUser != null) 
      { 
       _selectedUser.PropertyChanged -= propChangedHandler; 
      } 
      _selectedUser = value; 
      if (_selectedUser != null) 
      { 
       _selectedUser.PropertyChanged += propChangedHandler; 
      } 
      RaisePropertyChanged("selectedUser"); 
     } 
    } 
} 
+0

感谢您对此进行更新。我希望你会回答,以便我可以接受,但我很感激帮助。 –