0

クラスの通常のプロパティを設定するために、添付の動作を作成しています。

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でバインドできないため、このアタッチされた動作になります。

これで、文字列またはオブジェクトを使用してこの添付プロパティを使用すると機能し、設定したブレークポイントがヒットしますが、バインディングマークアップを使用して設定すると、実行されません。なぜこれが機能しないのですか?

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

私がする必要があるのは、ItemsSourceプロパティをBindingで指定された値に設定することです。

4

2 に答える 2

3

Get および Set メソッドでは、受信オブジェクトを GridColumn として定義していますが、それは DependencyObject である必要があります。

また、変更ハンドラーで DP にキャストしたため、DP の型を object から IEnumerable に変更することもできます。

于 2010-02-07T15:46:04.803 に答える
-1

使用しているマークアップを投稿していただけますか? また、実際のプロパティがオブジェクトに存在し、そこで意味がある場合は、ヘルパー クラスの添付プロパティではなく、そのオブジェクトの通常の依存関係プロパティを使用する必要があると思います。

MSDN からの編集 : GetPropertyName アクセサーの署名は次のようにする必要があります。

public static object GetPropertyName(object target)

SetPropertyName アクセサーの署名は次のようにする必要があります。

public static void SetPropertyName(object target, object value)

あなたの場合、GridColumn は正しいターゲット タイプですか?

于 2010-02-07T10:42:59.350 に答える