【发布时间】:2012-09-14 13:34:49
【问题描述】:
我试图将视图模型中的枚举属性表示为视图中的一组单选按钮。到目前为止,一切都很好;我可以用双向MultiBinding 来表达:
(rb1.IsChecked, rb2.IsChecked, rb3.IsChecked) vm.Value
这里使用的多重绑定将具有一个多重转换器,可在(bool, bool, bool) <-> MyValue 之间转换;显然,MyValue 类型的(三个)允许值之一是根据bool 是true 来选择的,反之亦然。
不过,这已经有点不方便了:我无法在视图的 Xaml 中定义该绑定,因为必须从单个值的一侧定义多重绑定。因此,我必须在代码隐藏中定义多重绑定并使用SetBinding 将其设置在我的视图模型的Value 属性上。
现在,我遇到的问题是我不只是将一组单选按钮绑定到该值,而是两个。因此,我的绑定必须如下所示:
(rbA1.IsChecked, rbA2.IsChecked, rbA3.IsChecked) vm.Value (rbB1.IsChecked, rbB2.IsChecked, rbB3.IsChecked)
问题是我不能同时使用SetBinding 将多个绑定连接到vm.Value。
到目前为止我尝试过的解决方案是:
- 使用一个 big 多重绑定,一次绑定到所有单选按钮。这意味着
(rbA1.IsChecked, rbA2.IsChecked, rbA3.IsChecked, rbB1.IsChecked, rbB2.IsChecked, rbB3.IsChecked) <-> vm.Value形式的绑定。此解决方案的问题在于,如果选中了其中一个单选按钮(例如,rbB2),我无法判断rbA2(未选中)或rbB2(选中)是否具有“新的,正确的”价值。 - 首先通过定义一个单选按钮组 控件来抽象单选按钮组,该控件只公开一个
SelectedIndex属性。然后,这个属性可以方便地从我的 radio group 控件的所有实例中绑定到我的vm.Value属性。虽然可行,但它需要编写一个新的控件类,我想知道这是否是 WPF 中的唯一方法。 - 将一组单选按钮绑定到另一组:通过双向绑定
rbB1到rbA1、rbB2到rbA2等等,并在我的vm.Value之间使用多重绑定并且只有第一组单选按钮,我会达到预期的效果,但我不喜欢拥有“主单选组”的概念。这将滥用 GUI 元素进行数据传输。 - 在代码隐藏中执行所有操作并手动更新单选按钮和视图模型值。当然这是一个可行的后备解决方案,但是这感觉在 Xaml/with 绑定中应该是可行的。
【问题讨论】:
-
“使用一个大的多重绑定”,我不太明白。您有两个 radioButton 组。您可以从 group1 中选择一项,也可以从 group2 中选择一项。我不明白“具有新的正确值”。
-
@ChrisDD:“大多重绑定”将同时绑定
vm.Value与所有六个单选按钮。六个单选按钮可以有一个初始状态,例如(1, 0, 0, 1, 0, 0)。现在,假设有人点击了第二组中的第二个单选按钮,所以我的多转换器被(1, 0, 0, 0, 1, 0)调用。如何判断第一组还是第二组正确,即返回第一个枚举值还是第二个枚举值?据我所知,这并不方便。 -
为什么不对每个 RadioButton 使用单个绑定?也使用转换器和命令参数。如:IsChecked={Binding VMEnum, Converter={StaticResource toEnum}, ConverterParameter={YourEnum:FirstButtonChecked}}。您需要实现双向转换器。无论哪种方式 IsChecked = VMEnum == (CommandParameter as Enum) [一种方式]
-
用于从 ViewMODEl 控制 RadioBoxes。对于相反的方式,逻辑将是:IsChecked==true 然后返回 CommandParameter。绑定必须是双向的
-
@ChrisDD:很好,只要在
IsChecked更改为true时调用转换器。但是,当这种情况发生时,所有其他单选按钮的IsChecked属性将更改为false;他们的转换器应该返回什么?
标签: wpf binding multibinding two-way-binding