Прикрепленное имущество и привязка - PullRequest
0 голосов
/ 07 февраля 2010

Я создаю прикрепленное поведение, чтобы установить обычное свойство класса:

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);
    }
}   

Здесь свойство ItemsSource в MyControl является обычным свойством, поэтому я не могу связать его в Xaml, поэтому это присоединенное поведение.

Теперь, когда я использую это присоединенное свойство, используя строку или объекты, оно работает, и заданная мною точка останова срабатывает, но когда я устанавливаю его с помощью разметки Binding, оно никогда не запускается. Почему это не работает?

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

Что мне нужно сделать, это установить для свойства ItemsSource значение, указанное в Binding.

Ответы [ 2 ]

3 голосов
/ 07 февраля 2010

В ваших методах Get и Set вы определяете принимающий объект как GridColumn, где он должен быть DependencyObject.

Возможно, вы также захотите изменить тип вашего DP с объекта на IEnumerable с момента приведения его к типу в обработчике изменений.

0 голосов
/ 07 февраля 2010

Можете ли вы опубликовать разметку, которую вы используете? Кроме того, если фактическое свойство существует в объекте и имеет смысл, тогда я думаю, что вы должны использовать обычное свойство зависимости для этого объекта вместо присоединенного свойства в классе помощника.

Редактировать Из MSDN: Подпись для метода доступа GetPropertyName должна быть:

public static object GetPropertyName(object target)

и подпись для метода доступа SetPropertyName должна быть:

public static void SetPropertyName(object target, object value)

В вашем случае, GridColumn правильный тип цели?

...