【问题标题】:WPF Notify not working with multiple viewmodelsWPF 通知不适用于多个视图模型
【发布时间】:2016-08-01 10:06:28
【问题描述】:

所以基本上我有三个视图模型。一种是实时存储和计算所有数据的 ShellViewModel。还有另外两个以不同方式显示计算的视图模型。这两个 VM 在 shell 视图中显示为视图(通过 caliburn 容器和与 ContentControl 绑定的 ActiveItem)。为了将数据发送到其他 VM,我将它们的属性绑定到 shell VM 的属性,方法是将它们发送到第二个 VM 的构造函数中。

VM = new ViewModelA(_PropertyOfShellVM);
//---
ViewModelA(PropertyOfShellVM p)
{
    VMProp = p;
}

属性是来自没有通知功能的 dll 中的类。作为参考类型,VM 中的类是相同的。在其他虚拟机中,我绑定到这些类属性。

class PropertyOfShellVM
{
     bool PropertyA{get;set;}
     int PropertyB{get;set;}
}

<CheckBox Content="PropA" IsChecked="{Binding VMProp.PropertyA}"/>
<Slider Value="{Binding VMProp.PropB}"/>

问题是这些类经常变化并且需要不断更新。但是当使用 Caliburn 的 NotifyOfPropertyChange(()=>VMProp) 时,UI 不会更新。我尝试在属性 getter 中编写通知,但没有任何效果。我还尝试在自定义事件上重新绑定 VM 属性,我通过 Caliburn 的事件管理器发送了新结果,但它太慢了(我让这些值每秒更改多次,但事件大约每 3 次更新 UI秒)。通知如何修复?

【问题讨论】:

    标签: c# wpf mvvm data-binding caliburn


    【解决方案1】:

    您可能希望使用Caliburn.Micro's Event Aggregator 将更改从一个视图模型传递到另一个视图模型。不过,我不确定它如何影响性能。

    【讨论】:

    • 在最后一段中我说我试过了,但它真的很慢=)我没有说那是 Caliburn 事件管理器,mb
    【解决方案2】:

    通过使用 VMs Refresh() 方法修复了该问题,该方法强制 VM 的所有属性在 UI 上刷新。就良好实践而言,这是一个相当粗略的决定,但它足够快并且有效。暂时不会将此标记为答案,因为可能有更好的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-07
      • 2017-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多