'链式'WPF绑定

时间:2011-05-14 16:49:06

标签: .net wpf wpf-controls binding

我正在WPF中创建一个UserControl,我正在调用YesNoButton。

它有一个DependencyProperty,IsChecked,并包含两个ToggleButtons,标签为“Yes”和“No”。我已将 ToggleButton的IsChecked属性绑定到父YesNoButton的此IsChecked属性。我通过'反向布尔'IValueConverter将 No ToggleButton的IsChecked属性绑定到 ToggleButton的IsChecked属性。这是我的YesNoButton标记,减去一些外观和感觉褶边:

<UserControl ...>
    <StackPanel Orientation="Horizontal">
        <ToggleButton x:Name="YesButton" IsChecked="{Binding RelativeSource={RelativeSource AncestorType={x:Type Controls:YesNoButton}}, Path=IsChecked}">Yes</ToggleButton>
        <ToggleButton IsChecked="{Binding ElementName=YesButton, Path=IsChecked, Converter={StaticResource BooleanToInverseConverter}}">No</ToggleButton>
    </StackPanel>
</UserControl>

在我的应用中,我按如下方式添加YesNoButton:

<local:YesNoButton IsChecked="{Binding Path=BoolPropertyOfDataContext}" />

当窗口首次加载时,如果我通过其他方式切换BoolPropertyOfDataContext,则YesNoButton会做出完美的反应。

但是一旦我单击Yes或No ToggleButton,虽然YesNoButton可视状态正确更新,但是对BoolPropertyOfDataContext的绑定完全停止 - 它似乎被取消了。我认为这些'绑定链'应该可以正常工作,但我显然在这里遗漏了一些东西!

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

两个建议:

  1. 为您的UserControl命名,以便您可以参考它
  2. 将ToggleButton IsChecked状态绑定到UserControl的IsChecked属性
  3. 例如:

    <StackPanel Orientation="Horizontal">
        <ToggleButton IsChecked="{Binding ElementName=YesNoButton, Path=IsChecked}">Yes</ToggleButton>
        <ToggleButton IsChecked="{Binding ElementName=YesNoButton, Path=IsChecked, Converter={StaticResource BooleanToInverseConverter}}">No</ToggleButton>
    </StackPanel>
    

答案 1 :(得分:0)

我通过设置CheckBox的样式来实现它:

<CheckBox IsChecked="{Binding Path=BoolPropertyOfDataContext}" Style="{StaticResource YesNoButton}" />

<Style x:Key="YesNoButton" TargetType="{x:Type CheckBox}">
    <Setter Property="OverridesDefaultStyle" Value="True" />
    <Setter Property="SnapsToDevicePixels" Value="True" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type CheckBox}">

                <StackPanel Orientation="Horizontal">
                    <ToggleButton x:Name="YesButton" IsChecked="{Binding RelativeSource={RelativeSource AncestorType={x:Type CheckBox}}, Path=IsChecked}">Yes</ToggleButton>
                    <ToggleButton IsChecked="{Binding ElementName=YesButton, Path=IsChecked, Converter={StaticResource BooleanToInverseConverter}}">No</ToggleButton>
                </StackPanel>

            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>