WPF和MVVM:在运行时更改数据绑定转换器

use*_*783 6 data-binding wpf mvvm ivalueconverter

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

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

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

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

jap*_*apf 5

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

有关更多信息,请参阅此讨论.

  • 在提问时我可能过于简单了.让我们假设我有List <LargeDataStructure>而不是List <int>,我想将转换应用于LargeDataStructure的单个成员.创建和公开List <NewLargeDataStructure>似乎非常繁重,其中NewLargeDataStructure引用LargeDataStructure(或者更糟糕的是,复制它)并以相同的方式重新公开除了一个属性之外的所有属性.ValueConverter似乎要轻得多 - 只需"动态"更改单个属性. (2认同)

Hei*_*nzi 0

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