附属物和装订

时间:2010-02-07 10:27:32

标签: wpf binding attached-properties attachedbehaviors

我正在创建一个附加行为,以便设置类的常规属性:

public class LookupHelper
{
    public static readonly DependencyProperty ItemsSourceProperty = DependencyProperty.RegisterAttached("ItemsSource", typeof(object), typeof(LookupHelper), new UIPropertyMetadata(null, OnItemsSourceChanged));

    private static void OnItemsSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var control = d as MyControl;
        if(control == null)
                return;

        control.ItemsSource = (IEnumerable)e.NewValue;
    }

    public static object GetItemsSource(GridColumn column)
    {
        return column.GetValue(ItemsSourceProperty);
    }

    public static void SetItemsSource(GridColumn column, object value)
    {
        column.SetValue(ItemsSourceProperty, value);
    }
}   

这里,MyControl上的ItemsSource属性是一个常规属性,所以我不能在Xaml中绑定它,因此这个附加行为。

现在,当我使用这个附加属性时,它使用字符串或对象,并且我设置的断点被命中,但是当我使用Binding标记设置它时,它永远不会运行。为什么这不起作用?

<MyControl ctrl:LookupHelper.ItemsSource="DataSource"/>; //It works
<MyControl ctrl:LookupHelper.ItemsSource="{Binding Path=MyDataSource}"/>; //Does not work

我需要做的是将ItemsSource属性设置为Binding指定的值。

2 个答案:

答案 0 :(得分:3)

在Get和Set方法中,您将接收对象定义为GridColumn,它应该是DependencyObject。

您可能还希望将DP的类型从对象更改为IEnumerable,因为您将其转换为更改处理程序中的类型。

答案 1 :(得分:-1)

您能否发布您正在使用的标记?此外,如果对象上存在实际属性并且有意义,那么我认为您应该在该对象上使用常规依赖项属性而不是辅助类上的附加属性。

修改 来自MSDN: GetPropertyName访问者的签名必须是:

public static object GetPropertyName(object target)

并且SetPropertyName访问者的签名必须是:

public static void SetPropertyName(object target, object value)

在你的情况下,GridColumn是正确的目标类型吗?