【发布时间】:2010-08-19 07:50:28
【问题描述】:
您好,创建了我的第一个基于 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 的简单扩展,用于封装 View。
在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 内的一个方法,那么它就会被触发,所以我很难理解为什么这在父视图模型中不起作用。我哪里错了?
【问题讨论】:
-
如何触发 Name 属性更改?如果是通过数据绑定,你使用的是双向模式吗?检查输出窗口是否有数据绑定错误。另外,您是否尝试过在 Name 属性设置器中设置断点,它是否被命中?
-
嗨,马特,在这两个方面都是的,但我刚刚发现了另一个 SO 问题来解释这种行为。
标签: mvvm-light