【问题标题】:WPF and MVVM: Changing data binding converter at runtimeWPF 和 MVVM:在运行时更改数据绑定转换器
【发布时间】:2009-10-27 14:01:00
【问题描述】:

我在我的用户界面中使用 WPF 和 MVVM 模式。在我的 ViewModel 中,我有一个包含以毫米为单位的距离的列表,我通过将 ListView.ItemsSource 绑定到列表来显示在 ListView 中。但是,我希望显示的值使用更自然的单位 - 米或英尺,具体取决于“公制”复选框的状态。

我编写了几个简单的类,MillimetresToMetresConverter 和 MillimetresToFeetConverter,它们都实现了 IValueConverter。虽然我可以将我的数据绑定上的 Converter 属性设置为一个或另一个,但我不确定当复选框的状态发生变化时如何在这些转换器之间进行更改。

我的计划是在我的 ViewModel 上有一个字段“IValueConverter lengthConverter”,我可以将其设置为一个转换器或另一个,然后在我的 XAML 中执行 ...="{Binding Converter={Binding Path=lengthConverter}}" - 不幸的是,这不起作用,因为 Converter 不是依赖属性。

如何在运行时更改数据绑定使用的转换器?

【问题讨论】:

  • 您应该能够使用 DependencyObject.GetBinding(DependencyProperty),例如myTextBlock.GetBinding(TextBlock.TextProperty) 获取(和修改)Binding 对象。
  • 不幸的是,遵循 MVVM 模式意味着代码需要存在于 ViewModel 中——它没有对视图的引用,因此无法触及“myTextBlock”。

标签: wpf data-binding mvvm ivalueconverter


【解决方案1】:

大多数时候,使用 MVVM 方法时,您可以在 VM 类中执行格式化任务。在您的情况下,您可以将 Format 属性添加到 VM 类,并根据 Format 属性的值返回格式正确的字符串。

更多信息请参见this discussion

【讨论】:

  • 没错。转换器在 MVVM 应用程序中非常少见,通常只在自定义控件中弹出。
  • 假设我的 ViewModel 有一个 List<int> Distances 属性,我将 ListView.ItemsSource 绑定到该属性。您是否建议不要让 Distances.get 按原样返回列表,而应该返回一个不同的列表 - 已应用转换?
  • @Paul:是的。 ViewModel 只是一个 ValueConverter ;-)。您可以在 WPF Disciples 讨论板上阅读类似的讨论:groups.google.com/group/wpf-disciples/msg/c29b3935ec9d3c4e
  • 也许我在问这个问题时过于简单化了。假设我有 List 而不是 List,并且我想将转换应用于 LargeDataStructure 的单个成员。创建和公开 List 似乎相当笨拙,其中 NewLargeDataStructure 引用了一个 LargeDataStructure(或更糟的是,复制它)并以相同的方式重新公开它的所有属性,但其中一个属性除外。 ValueConverter 似乎要轻得多 - 只需“即时”更改单个属性。
【解决方案2】:

如果我可以建议一个简单的替代解决方案:在您的 ViewModel 中创建一个小的 FormatMillimetresConverter,其 UseMetric 属性绑定到“metric”复选框。

【讨论】:

  • 谢谢 - 但是一旦我在 ViewModel 中有一个 FormatMillimetresConverter,我如何让 ListView 使用它?
  • 好点。 :-) 您可以将它的一个实例导出为 ViewModel 的静态属性,然后通过“... Converter={x:Static local:ViewModel.MyFormatMillimetresConverter}”访问它,但不知何故这不是很优雅...
  • 中创建 FormatMillimetresConverter 怎么样?然后它可以作为静态资源使用,您可以使用“... Converter={StaticResource...”将其作为转换器附加到 ListView.ItemsSource,并使用“{Binding Source={StaticResource...”附加到复选框。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-17
  • 2015-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-30
  • 1970-01-01
相关资源
最近更新 更多