【问题标题】:'Chained' WPF binding“链式”WPF 绑定
【发布时间】:2011-08-25 14:07:54
【问题描述】:

我正在 WPF 中创建一个 UserControl,我称之为 YesNoButton。

它有一个 DependencyProperty IsChecked,并包含两个 ToggleButtons,标签分别为“Yes”和“No”。我已将 Yes ToggleButton 的 IsChecked 属性绑定到父 YesNoButton 的 IsChecked 属性。我已通过“逆布尔”IValueConverter 将 No ToggleButton 的 IsChecked 属性绑定到 Yes 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 反应完美。

但是当我单击是或否切换按钮时,虽然 YesNoButton 视觉状态更新正确,但与 BoolPropertyOfDataContext 的绑定完全停止工作 - 它似乎被取消了。我认为这些“绑定链”应该可以正常工作,但我显然在这里遗漏了一些东西!

有什么想法吗?

【问题讨论】:

    标签: .net wpf wpf-controls binding


    【解决方案1】:

    两个建议:

    1. 为您的 UserControl 命名以便您可以引用它
    2. 将两个 ToggleButton IsChecked 状态绑定到 UserControl 的 IsChecked 属性

    例如:

    <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) - 没有区别。我尝试完全删除 No ToggleButton ,但它仍然不起作用,所以我认为(2)没有帮助。我知道过去当我手动将控件的 IsChecked 属性设置为某个值时,它的绑定被破坏了。我认为这里正在发生类似的事情,但我不知道是什么。
    • BoolPropertyOfDataContext 是如何实现的?它是依赖属性吗?另外,如果您在调试器下运行,您是否注意到输出窗口中有任何消息?
    • BoolPropertyOfDataContext 是实体框架实体对象的布尔字段(属性更改通知也是如此)。很遗憾,输出窗口中没有消息!
    • 让它以完全不同的方式工作(请参阅我编辑的帖子),但我仍然不知道为什么我的第一次尝试没有成功!
    【解决方案2】:

    我通过设置 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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-16
      • 2011-02-02
      • 2011-05-11
      • 1970-01-01
      • 2013-12-10
      • 2012-02-20
      • 1970-01-01
      • 2011-10-22
      相关资源
      最近更新 更多