将数据上下文绑定到自定义控件
本文关键字:自定义控件 绑定 上下文 数据 | 更新日期: 2023-09-27 17:52:12
我试图在一个自定义控件中绑定一个值放在一个datagridtemplatecolum列内,但绑定似乎不工作。
My datagridtemplateccolumn:
<DataGridTemplateColumn Width="auto" SortMemberPath="Etat" CanUserReorder="False" CanUserResize="True" x:Name="colonneEtat">
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate />
</DataGridTemplateColumn.CellEditingTemplate>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<widget:MyWidget MyObject="{Binding MyObjectVariable, Converter={StaticResource MyDebugConverter}}" Margin="5,0" VerticalAlignment="Center"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
我的自定义控件现在只包含一个Grid,但它有一个定义如下的属性:
public static readonly DependencyProperty MyObjectProperty=
DependencyProperty.Register("MyObject",
typeof(ObjectType),
typeof(MyWidget),
new PropertyMetadata(null));
public ObjectType MyObject
{
get { return (ObjectType)GetValue(MyObjectProperty); }
set {
SetValue(MyObjectProperty, value);
FillCustomControl();
}
}
Debug Converter只是一个测试绑定的虚拟转换器:
public object Convert(object value, Type targetType,
object parameter, CultureInfo culture)
{
System.Diagnostics.Debugger.Break();
return value;
}
我的自定义控件工作得很好,我已经在应用程序的另一个地方尝试过了。它的功能很简单:设置属性后,根据属性的内容填充自定义控件。如前所述,此行为已经过测试。
但是在这个DataGridTemplateColumn的情况下,该属性永远不会设置。我在输出中没有任何绑定错误,调试器在转换器中停止+转换器中的值是预期的值。但是由于某些原因,它没有在我的自定义控件中设置属性的值。
我错过了什么?
谢谢
在对DependencyProperty
进行数据绑定时,您应该省略Property
部分,而不是:
<widget:MyWidget ObjectProperty="{Binding MyObject ... }" />
你应该这样写:
<widget:MyWidget MyObject="{Binding MyObject ...}" />
除非您在Widget
类中定义了另一个名为ObjectPropertyProperty
的DependencyProperty
。此外,根据您的代码,为DataGrid
设置为DataContext
的对象也应该有一个名为MyObject
的属性。
更新>>>
好的,现在我明白你的问题了。也就是说,与DependencyProperty
相关的CLR属性的setter是永远不会被框架调用…该CLR属性仅供您的使用。如果您想在DependencyProperty
值改变时做一些事情,那么您需要设置PropertyChangedCallback
处理程序。你可以这样做(从MSDN的链接页面):
public static readonly DependencyProperty AquariumGraphicProperty = DependencyProperty.Register(
"AquariumGraphic",
typeof(Uri),
typeof(AquariumObject),
new FrameworkPropertyMetadata(null,
FrameworkPropertyMetadataOptions.AffectsRender,
new PropertyChangedCallback(OnUriChanged)
)
);
private static void OnUriChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) {
Shape sh = (Shape) d;
sh.Fill = new ImageBrush(new BitmapImage((Uri)e.NewValue));
}
实际上,您甚至可以忽略PropertyChangedCallback
构造函数,并像这样声明它:
public static readonly DependencyProperty AquariumGraphicProperty =
DependencyProperty.Register("AquariumGraphic", typeof(Uri), typeof(AquariumObject),
new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsRender,
OnUriChanged));