在代码中手动设置属性后,丢失单选按钮的绑定

时间:2011-09-11 04:57:05

标签: wpf xaml binding properties radio-button

我的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。

2 个答案:

答案 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可能不完全正确)