将数据上下文绑定到自定义控件

本文关键字:自定义控件 绑定 上下文 数据 | 更新日期: 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类中定义了另一个名为ObjectPropertyPropertyDependencyProperty。此外,根据您的代码,为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));