【问题标题】:wpf target property dependencywpf目标属性依赖
【发布时间】:2012-10-11 05:16:24
【问题描述】:

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

首先,这里是 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,它可以正常工作

我做错了什么?

【问题讨论】:

  • 你试过用 FrameworkPropertyMetaData 代替 UIPropertyMetadata 吗?

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


【解决方案1】:

有两个主要问题-

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

要么指定为 TwoWay in xaml 像这样 -

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

上述方法的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}/>

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我试过你说的,但没有任何改变。另外我不认为该属性是可空的,因为 IsChecked 它也可以像“QCV_Localizacao_Reutilizacao”属性一样为空。
    猜你喜欢
    • 2014-05-23
    • 2013-01-27
    • 1970-01-01
    • 1970-01-01
    • 2013-01-31
    • 2011-03-28
    • 2012-11-08
    相关资源
    最近更新 更多