c# - 绑定(bind)到只读 ViewModel 属性并在更改时更新 UI

标签 c# wpf mvvm observablecollection

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

在基于 WPF/MVVM 的应用程序中,我有一个包含 ObservableCollection 对象的 ViewModel。这些对象中的每一个都有一个实现 INotifyPropertyChanged 的​​枚举“状态”成员。

在 View 中,我需要显示集合中具有特定“状态”的对象的数量。由于每个对象的状态都可以动态更新,因此 View 需要在显示的值中反射(reflect)这些动态变化。

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

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

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

* 编辑 *

在发布时,我已经有了一个可行的解决方案。我不想把我已经做过的事情弄得一团糟,因为我认为可能有更好的方法。无论如何,根据当前的响应,也许我现有的解决方案比我预期的更容易接受。

目前,我:
  • 订阅我的集合的 CollectionChanged 事件,在事件处理程序中,我在“计数”属性上手动触发 PropertyChanged 事件。
  • 我将集合本身​​基于“TrulyObservableCollection”而不是“ObservableCollection”,以便捕获底层对象中的各个状态更改事件。

  • 这一切似乎都按预期工作,但我认为可能有一种更清洁的方式。

    最佳答案

    将事件处理程序附加到 FileCollection.CollectionChanged

    在 EventHandler 中调用 RaisePropertyChanged("TranslatedWithErrorsCount") 在您的 ViewModel 上。

    如果要检查 状态属性变化...
    您必须从 附加和分离处理程序属性已更改 中的项目数收藏已更改 处理程序。
    存储此类处理程序的最简单方法是字典。

    编辑:
    实际上,这是处理这些问题的好方法:
    https://stackoverflow.com/a/8490996/1749204

    关于c# - 绑定(bind)到只读 ViewModel 属性并在更改时更新 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22354624/

    相关文章:

    android - 没有引用 View with Camera 2 的 ViewModel

    c# - WPF 将命令绑定(bind)到 Datagrid 内的 Datacontext

    c# - 按键事件不会被方向键激活

    c# - 如何从 C# 关闭计算机

    javascript - Url.Action 有一个对象路由值为 null

    c# - wpf 在 activeX 之上

    c# - 如何使用 Infragistics XamDataGrid 将所选项目绑定(bind)到模型?

    silverlight - 如何从silverlight中用户控件的 View 模型类打开另一个用户控件?

    c# - 创建自定义 RichTextBox 控件

    c# - 使用对象列表构建树