无法使用 MVVM-Light 挂钩 PropertyChanged 事件
您好,创建我的第一个基于 MVVM 的 WPF 应用程序,并尝试找出为什么我无法挂钩依赖项属性的 PropertyChanged 事件。
父视图模型中的代码:
void createClients()
{
var clients = from client in Repository.GetClients()
select new ClientViewModel(Repository, client);
foreach (var client in clients)
{
client.PropertyChanged += onClientPropertyChanged;
}
Clients = new ViewableCollection<ClientViewModel>(clients);
Clients.CollectionChanged += onClientsCollectionChanged;
}
// Never gets called
void onClientPropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == "Name")
{
//...
}
}
ViewableCollection 是 ObservableCollection 的简单扩展来封装一个视图。
在 ClientViewModel
中,setter 被调用,但 RaisePropertyChanged 没有按照我的预期工作,因为 onClientPropertyChanged
没有被调用。两个视图模型都继承自ViewModelBase
。
public string Name
{
get { return client.Name; }
set
{
if (value == client.Name) return;
client.Name = value;
RaisePropertyChanged("Name");
}
}
如果我将 PropertyChanged
连接到 ClientViewModel
内的一个方法,那么它就会被触发,所以我很困惑为什么这在父视图模型中不起作用。我哪里出错了?
Greetings, creating my first MVVM based WPF app and trying to figure out why I'm unable to hook into the PropertyChanged event of a dependency property.
Code in the parent view model:
void createClients()
{
var clients = from client in Repository.GetClients()
select new ClientViewModel(Repository, client);
foreach (var client in clients)
{
client.PropertyChanged += onClientPropertyChanged;
}
Clients = new ViewableCollection<ClientViewModel>(clients);
Clients.CollectionChanged += onClientsCollectionChanged;
}
// Never gets called
void onClientPropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == "Name")
{
//...
}
}
ViewableCollection is a simple extension of ObservableCollection to encapsulate a View.
In the ClientViewModel
the setters are being called but RaisePropertyChanged isn't working as I would expect, because onClientPropertyChanged
isn't being invoked. Both view models inherit from ViewModelBase
.
public string Name
{
get { return client.Name; }
set
{
if (value == client.Name) return;
client.Name = value;
RaisePropertyChanged("Name");
}
}
If I wire up PropertyChanged
to a method inside the ClientViewModel
then it is being fired, so I'm stumped as to why this isn't working in the parent view model. Where am I going wrong?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这个问题解释了问题; ObservableCollection 保护 PropertyChanged 事件。
一种解决方案是使用 MVVM-Light Messenger:
应该重构 createClients(),但为了与问题代码保持一致,我将其保留在那里。然后对属性设置器稍作更改:
This SO question explains the problem; ObservableCollection protects the PropertyChanged event.
One solution is to use MVVM-Light Messenger:
createClients() should be refactored, but for consistency with the question code I'll leave it in there. Then a slight change to the property setter: