如何正确订阅另一个类的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中订阅这些事件?
答
断开与当前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
感谢您对此进行更新。我希望你会回答,以便我可以接受,但我很感激帮助。 –
你在说什么?您的usersVM类中甚至没有“enabled”属性。请注意,在selectedUser属性设置器中,您应该从旧属性值中分离propChangedHandler并将其附加到新属性中。 – Clemens
修正了这个错误。你能分享一个你在这里描述的例子吗? –
为什么superUser是'int'而不是'bool'?对于PropertyChangedHandler,你有'this.selectedUser.PropertyChanged + = propChangedHandler'。现在想象一下,当你给'selectedUser'分配一个新值时会发生什么。 – Clemens