【问题标题】:Changing WPF databindings based on value of another property根据另一个属性的值更改 WPF 数据绑定
【发布时间】:2011-03-21 02:33:58
【问题描述】:

我对 WPF 相当陌生,已经开发了几个带有代码隐藏文件的应用程序,并且在开始我当前的应用程序之前已经阅读了 MVVM(通过 Schifflett 的“in the box”介绍)。

我正在使用的项目有一堆通用字符串属性,以及一个名为 Hours 的 Dictionary 属性,它将日期映射到工作时间。

我的用户界面具有这些项目的 DataGrid 视图(绑定到 ViewModel 中的集合),以及一个允许用户选择日期的组合框(它将所选值绑定到 ViewModel 中的SelectedDate)。 DataGrid 的 Hours 列需要显示一周中的工作小时数(即,与调用 item.Hours[SelectedDate] 或类似的效果相同)。

最好的方法是什么?是否可以在 {Binding Hours[SelectedDate]} 之类的绑定表达式中放入变量?

【问题讨论】:

  • 我不确定我是否理解。您有一个数据网格,其中包含工作日期和小时数的集合。还有一个组合框,可让您选择日期。为什么两者都需要?

标签: wpf mvvm binding


【解决方案1】:

立即想到的两个解决方案是:

1) 创建一个基于您的 SelectedDate 的 Hours 属性:

public int Hours {get { return calculateHours(SelectedDate); } }

"calculateHours" 可以是一种方法,也可以将计算放在 Setter 本身中。确保每当设置 SelectedDate 时,您也会为“Hours”提高 PropertyChanged。

如果仅在此 ViewModel 的此 View 中使用此 Hours 计算,我将使用此方法。

2) 创建一个接受日期并返回计算值的值转换器。然后将 Hours 绑定到 SelectedDate 属性:

<TextBlock Text="{Binding SelectedDate, Converter={StaticResource DateToHoursConverter}}"

如果需要在多个 View 或多个 ViewModel 中进行计算,我会使用这种方法。值转换器非常适合这种重用。

【讨论】:

    【解决方案2】:

    如果您绑定到的属性具有索引器,则可以绑定到它。您只需要在正确的时间为此索引器提高 INotifyPropertyChanged。

    编辑:绑定表达式中的变量将不起作用,但您可以绑定到 Hours 并使用转换器和 SelectedDate 作为转换参数来获取您想要的值。当“SeletedDate”更改时,您应该为“Hours”提高 INotifyPropertyChanged。

    【讨论】:

      猜你喜欢
      • 2017-01-02
      • 2017-12-12
      • 2023-01-06
      • 1970-01-01
      • 2013-09-05
      • 1970-01-01
      • 2021-08-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多