2012-10-21 37 views
3

我想在我的UserControl类来创建一个简单的Bindable属性称为MyBoolValueWPF目标属性dependecy

首先,这里的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不获取更新,反之亦然。

该窗口的DataContext其实现INotifyPropertyChanged类,所以 属性“QCV_Localizacao_Reutilizacao”应该工作正常。

另外,如果我用一个普通的CheckBox,而不是我的用户,它的作品没关系

什么即时做错了什么?

+0

你尝试使用FrameworkPropertyMetaData代替UIPropertyMetadata? – Johnny

回答

0

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

+0

我试过你说的,但没有任何变化。另外我不认为该属性是可空的,因为IsChecked也可以像“QCV_Localizacao_Reutilizacao”属性那样为空。 – George

0

主要有两大问题 -

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

要么specifed它是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财产掌握在你的窗口的DataContext的。但是,在默认情况下所有的控制将寻找在自己的DataContext绑定,所以你explicilty需要告诉它寻找到窗口的DataContext的使用RelativeSource这样的 -

<my:SimNaoRadioPicker MyBoolValue="{Binding QCV_Localizacao_Reutilizacao, 
           RelativeSource={RelativeSource Mode=FindAncestor, 
                AncestorType=Window}/>