wpf目标属性依赖项

时间:2012-10-21 00:01:37

标签: c# .net wpf xaml data-binding

我正在尝试在Bindable类中创建名为MyBoolValue的简单UserControl属性

首先,这里是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;
   }      
}

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

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

Binding无效,属性QCV_Localizacao_Reutilizacao不会更新,反之亦然。

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

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

我做错了什么?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

有两个主要问题 -

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

将它指定为TwoWay in xaml,如此 -

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

以上apporach的drawback是您必须在使用UserControl的实例时显式设置模式。

另一种方法是修改你的DP本身,使用FrameworkPropertyMetadata -

在默认情况下使用这样的TwoWay模式进行绑定
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}/>