【问题标题】:WPF Binding to ViewModel and update of viewWPF 绑定到 ViewModel 和更新视图
【发布时间】:2013-10-31 15:43:37
【问题描述】:

我想绑定到我的完整 ViewModel,因为转换器需要 ViewModel 的两个属性来决定那里的颜色。

{Binding Converter={StaticResource ErrorCountToSignalColorConverter}

通过这个转换器获取 ViewModel 并可以读取两个属性(ErrorCount 和 HasReceivedData)。但是,当其中一个属性更改时,绑定不会更新。当然,这两个属性都引发了 OnPropertyChange()。

当两个属性之一发生更改时,如何实现要更新的视图(使用正确的颜色)?

【问题讨论】:

标签: c# .net wpf mvvm binding


【解决方案1】:

您可以使用 MultiBinding 从视图中传递这两个属性,但是 ErrorCount/HasReceivedData/Signal 之间的依赖关系会泄漏到 UI 代码中(并且每次使用时都需要重复)。视图模型的主要目标之一是允许将视图与这样的细节分开。

我建议使用枚举来表示一组可能性:

public enum SignalLevel {
    Low,
    Medium,
    High
}

然后将您当前的转换器逻辑应用于这些值而不是颜色,并将其移动到视图模型中的单个属性:

public SignalLevel SignalLevel {
    get {
        // choose a level based on ErrorCount and HasReceivedData
    }
}

在视图模型中,每当ErrorCountHasReceivedData 更改时,将NotifyPropertyChanged 提升为SignalLevel

在视图中,做一个从信号电平到颜色的简单转换:

{Binding SignalLevel, Converter={StaticResource SignalToColorConverter}}

【讨论】:

  • 虽然 MultiBinding 也解决了这个问题,但这是最好的解决方案,因为它更简单、更透明。
【解决方案2】:

在这种情况下,您需要使用MultiValueConverter 选择多重绑定。它将多个属性(ErrorCountHasReceivedData)绑定到视图,并且任何属性的任何更改都会被反映。

MSDN simplistic example - Multibinding

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多