3

我正在尝试创建一个在我的类中Bindable调用的简单属性MyBoolValueUserControl

首先,这里是 xaml

<UserControl x:Class="TMDE.Controls.SimNaoRadioPicker"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             Height="16"
              DataContext="{Binding RelativeSource={RelativeSource Self}}">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <CheckBox  Grid.Column="0" Content="Teste" IsChecked="{Binding Path=MyBoolValue}" x:Name="chk" />
    </Grid>
</UserControl>

这里是代码隐藏:

public partial class SimNaoRadioPicker : UserControl
{

   public SimNaoRadioPicker()
    {
        InitializeComponent();
    }  

   public bool? MyBoolValue
   {
       get
       {
           return (bool?)GetValue(MyCustomPropertyProperty);
       }
       set
       {
           SetValue(MyCustomPropertyProperty, value);
       }
   }

   // Using a DependencyProperty as the backing store for MyCustomProperty.  This enables animation, styling, binding, etc...
   public static readonly DependencyProperty MyCustomPropertyProperty =
       DependencyProperty.Register("MyBoolValue", 
       typeof(bool?), typeof(SimNaoRadioPicker), 
       new UIPropertyMetadata(MyPropertyChangedHandler));


   public static void MyPropertyChangedHandler(DependencyObject sender, DependencyPropertyChangedEventArgs e)
   {
       // Get instance of current control from sender
       // and property value from e.NewValue

       // Set public property on TaregtCatalogControl, e.g.
       ((SimNaoRadioPicker)sender).chk.IsChecked = (bool?)e.NewValue;
   }      
}

现在,当尝试在另一个窗口中使用此控件时,如下所示:

    <my:SimNaoRadioPicker x:Name="test" MyBoolValue="{Binding QCV_Localizacao_Reutilizacao}"  Height="16" HorizontalAlignment="Left" Margin="287,456,0,0" VerticalAlignment="Top" Width="167" />

绑定不起作用,属性 QCV_Localizacao_Reutilizacao 没有得到更新,反之亦然。

Window 的 DataContext 是一个实现 INotifyPropertyChanged 的​​类,因此属性“QCV_Localizacao_Reutilizacao”应该可以正常工作。

此外,如果我使用常规 CheckBox 而不是我的 UserControl,它可以正常工作

我做错了什么?

4

2 回答 2

0

我将删除布尔值的可为空部分并将其设为布尔值,然后将绑定模式设置为两种方式。

于 2012-10-21T01:38:35.683 回答
0

主要有两个问题——

首先,您的绑定模式必须是TwoWay您可以通过两种方式实现的 -

要么指定它是TwoWay in xaml这样的 -

<my:SimNaoRadioPicker MyBoolValue="{Binding QCV_Localizacao_Reutilizacao,
                                              Mode=TwoWay}"/>

上面的drawback方法是,当您使用 UserControl 的实例时,您必须明确设置模式。

另一种方法是修改您的 DP 本身,使其在默认情况下始终以这样的双向模式绑定FrameworkPropertyMetadata-

public static readonly DependencyProperty MyCustomPropertyProperty =
       DependencyProperty.Register("MyBoolValue", 
       typeof(bool?), typeof(SimNaoRadioPicker), 
       new FrameworkPropertyMetadata(false, 
                FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, 
                            MyPropertyChangedHandler));

其次QCV_Localizacao_Reutilizacao属性在于你的Window的DataContext。但是,默认情况下,任何控件都会在其自己的 dataContext 中查找绑定,因此您需要明确告诉它使用RelativeSource这样的方式查看 Window 的 DataContext -

<my:SimNaoRadioPicker MyBoolValue="{Binding QCV_Localizacao_Reutilizacao,
                                RelativeSource={RelativeSource Mode=FindAncestor,
                                                     AncestorType=Window}/>
于 2012-10-21T08:15:24.897 回答