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/

    相关文章:

    c# - IXmlSerializable 和 XmlSerializer 一起发出

    c# - 数据绑定(bind) Entity Framework 导航属性 - 处理更改

    c# - 为什么 BackgroundWorker_RunWorkerCompleted 不更新 GUI?

    language-agnostic - 任务或对话框的Presentation-/ViewModel看起来如何?

    c# - 为什么要使用 DataForm?

    c# - 诊断应用程序变慢和内存消耗(可能是 WCF 或 MongoDB C# 驱动程序)?

    c# - Umbraco RelationService.GetByParentId(memberId) 慢。每个项目触发两个查询

    c# - 如何将文件从另一种语言(如钛 ios 应用程序和 java 应用程序)上传到 c# web 服务

    c# - 如何在网格中设置显示器宽度的 50%?

    c# - 如何简化从 WinForms 到 WPF 的过渡