我正在尝试在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,它的工作正常
我做错了什么?
答案 0 :(得分:0)
我会删除布尔值的可空部分并将其设为布尔值,然后将绑定模式设置为双向。
答案 1 :(得分:0)
有两个主要问题 -
首先,您的绑定模式需要TwoWay
,您可以通过两种方式实现 -
将它指定为TwoWay in xaml
,如此 -
<my:SimNaoRadioPicker MyBoolValue="{Binding QCV_Localizacao_Reutilizacao,
Mode=TwoWay}"/>
以上apporach的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}/>