绑定到只读ViewModel属性并在更改时更新UI

时间:2014-03-12 14:28:02

标签: c# wpf mvvm observablecollection

请参阅底部的编辑部分...

在基于WPF / MVVM的应用程序中,我有一个包含ObservableCollection对象的ViewModel。这些对象中的每一个都有一个enum" Status"实现INotifyPropertyChanged的成员。

在视图中,我需要显示集合中具有特定"状态"的对象计数。由于每个对象的状态都可以动态更新,因此View需要在显示的值中反映这些动态更改。

目前,我有一个ViewModel属性,它返回每个状态的计数(每个状态的一个属性)。例如:

public int TranslatedWithErrorsCount
{
    get { return FileCollection.Count(n => n.Status == TranslateStatus.TranslatedWithErrors); }
}

但是,由于每个count属性的值只是集合当前状态的副产品(因此我没有设置它),它'我不清楚如何最好地触发以更改对象状态开始的事件链,并以显示的计数值动态更新结束。


*编辑*

在发布时,我已经有了一个有效的解决方案。我不想用我已经做过的事情来淹没水域,因为我认为可能有更好的方法。无论如何,根据当前的反馈,我现有的解决方案可能比我预期的更容易接受。

目前,我:

  1. 订阅我的collection&#39的CollectionChanged事件,在事件处理程序中,我在我的" Count"上手动触发PropertyChanged事件。属性。
  2. 我将收藏品基于" TrulyObservableCollection"而不是" ObservableCollection"为了捕获底层对象中的各个状态更改事件。
  3. 这一切似乎都按预期工作,但我认为可能会有更清洁的方式。

2 个答案:

答案 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;
        }
    }
}