我的WPF xaml上有一个列表,其中包含两个项目。下面是每个项目的样式模板。现在在UI上,它显示为一组单选按钮(单选按钮的数量取决于我的列表中的项目数。)
<Style x:Key="RadioButtonListBoxItemStyle" TargetType="{x:Type ListBoxItem}" >
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<RadioButton FlowDirection="LeftToRight"
Margin="10 15"
Content="{Binding Value}"
GroupName="{Binding DisplayGroupName}"
IsChecked="{Binding IsSelected, Mode=TwoWay}" />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
现在我使用上面的样式模板绑定一个列表(有2个项目)来获得两个单选按钮。发生的事情是一切都很好,但当我在UI上更改单选按钮的选择时,IsSelected属性正在根据我的收音机是否被选中而被正确更新为真或假。但是如果我尝试手动设置代码中的列表,那么从那一点开始我的单选按钮与我的列表的绑定就会丢失,并且没有任何事情发生。
对此的任何帮助都很棒,根据我的需要,我必须手动设置代码中的列表。因此,即使我手动在代码中设置列表,也有任何解决方案不会丢失绑定。感谢。
-Ady。
答案 0 :(得分:2)
这是WPF中单选按钮的一个常见问题,它必须执行一个不寻常的绑定方面,这个方面比bug更具特色。
绑定设计假设只有两个改变绑定目标属性值的东西是:a)UI中的动作和b)源属性的更改。如果在代码中设置绑定的 target 属性,则显式设置Background
的{{1}},即使它具有绑定 - 绑定也会决定您知道你在做什么,它应该只是让步。所以它会自动关闭。
这在很大程度上是一个非常明智的设计决定。例如,它比抛出异常更好。大多数情况下,您无论如何都不会在代码中设置Border
;你会让绑定做到这一点。特别是如果你正在使用MVVM。
好的,那么如果组中有单选按钮会发生什么?
当您检查组中的一个按钮时,通过在代码中将IsEnabled
设置为false,管理单选按钮组的WPF代码将取消选中组中的所有其他按钮。绑定禁用自身。糟糕。
以下是解决方案:如果您正在使用单选按钮和绑定,请不要使用组。处理视图模型代码中的互斥逻辑。在您的情况下,对视图模型进行编码,以便集合中只有一个对象在任何给定时间都可以IsChecked
为真。 (是的,这很痛苦。)
单选按钮仍然可以按预期工作,但由于代码设置的唯一属性是源属性,因此绑定不会中断。
答案 1 :(得分:0)
您正在设置listboxitem类的样式,包括绑定。因此,当您从后面的代码设置列表时,它不包含listboxitems,它包含列表中的项目。所以,风格不适用。您应该做的是为列表中的项目类型设置<DataTemplate>
- 实际上告诉WPF您希望每个项目看起来像什么。
<DataTemplate TargetType="{x:Type MyCustomClass}" >
<DataTemplate>
<StackPanel Orientation="Horizontal">
<CheckBox IsChecked="{Binding Deleteable, Mode=TwoWay}" />
<Label Content="{Binding Name}" />
</StackPanel>
</DataTemplate>
</DataTemplate>
(这是我的头顶,所以xaml可能不完全正确)