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が更新されない、またはその逆。

ウィンドウのDataContextは、INotifyPropertyChangedを実装するクラスであるため、プロパティ「QCV_Localizacao_Reutilizacao」は正常に機能するはずです。

また、UserControlの代わりに通常のCheckBoxを使用すると、問題なく機能します。

私が間違っているのは何ですか?

4

2 に答える 2

0

ブール値のヌル可能部分を削除してブール値にし、バインディング モードを双方向に設定します。

于 2012-10-21T01:38:35.683 に答える
0

2つの大きな問題があります -

まず、バインド モードは、次TwoWayの 2 つの方法で達成できる必要があります。

どちらかがTwoWay in xamlこのように指定されています -

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

上記drawbackのアプローチでは、UserControl のインスタンスを使用するときは常にモードを明示的に設定する必要があります。

別のアプローチは、DP自体を変更して、このようなTwoWayモードでデフォルトで常にバインドされるようにすることですFrameworkPropertyMetadata-

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

次にQCV_Localizacao_Reutilizacaoプロパティはウィンドウの DataContext にあります。ただし、デフォルトでは、コントロールは独自の dataContext でバインドを検索するため、次のように使用して Window の DataContext を調べるよう明示的に指示する必要がありますRelativeSource

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