请参阅底部的编辑部分...
在基于WPF / MVVM的应用程序中,我有一个包含ObservableCollection对象的ViewModel。这些对象中的每一个都有一个enum" Status"实现INotifyPropertyChanged的成员。
在视图中,我需要显示集合中具有特定"状态"的对象计数。由于每个对象的状态都可以动态更新,因此View需要在显示的值中反映这些动态更改。
目前,我有一个ViewModel属性,它返回每个状态的计数(每个状态的一个属性)。例如:
public int TranslatedWithErrorsCount
{
get { return FileCollection.Count(n => n.Status == TranslateStatus.TranslatedWithErrors); }
}
但是,由于每个count属性的值只是集合当前状态的副产品(因此我没有设置它),它'我不清楚如何最好地触发以更改对象状态开始的事件链,并以显示的计数值动态更新结束。
*编辑*
在发布时,我已经有了一个有效的解决方案。我不想用我已经做过的事情来淹没水域,因为我认为可能有更好的方法。无论如何,根据当前的反馈,我现有的解决方案可能比我预期的更容易接受。
目前,我:
这一切似乎都按预期工作,但我认为可能会有更清洁的方式。
答案 0 :(得分:2)
将事件处理程序附加到 FileCollection.CollectionChanged
在EventHandler中,在ViewModel上调用 RaisePropertyChanged(“TranslatedWithErrorsCount”)。
如果您想检查状态属性是否更改... 您必须在 CollectionChandged 处理程序中的 PropertyChanged 项目中附加和分离处理程序。 存储此类处理程序的最简单方法是字典。
编辑: 实际上,这是处理这些的很好的方式: https://stackoverflow.com/a/8490996/1749204
答案 1 :(得分:1)
你可以在你的ObservableCollection上连接CollectionChanged,并在它的事件处理程序中挂钩状态的变化(可能不会编译,但你明白了):
private void OnPropertyChanged(object sender, NotifyPropertyChangedEventArgs e)
{
PropertyChanged("TranslatedWithErrorsCount");
}
FileCollection.CollectionChanged += (sender, e) =>
{
PropertyChanged("TranslatedWithErrorsCount");
if (e.NewItems != null)
{
foreach (var item in e.NewItems)
{
var inpc = item as INotifyPropertyChanged;
inpc.PropertyChanged += OnPropertyChanged;
}
}
if (e.OldItems != null)
{
foreach (var item in e.OldItems)
{
var inpc = item as INotifyPropertyChanged;
inpc.PropertyChanged += (sender, e) => OnPropertyChanged;
}
}
}