2010-02-07 2 views
0

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

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.

+0

Где вы устанавливаете точку останова? Какой метод/строка не вызывается, пока вы думаете, что она должна? –

+0

Вы пытались использовать свойство 'Source'' Binding' вместо 'Path'? (Вам нужно указать источник как 'StaticResource') – mg007

ответ

3

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

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

-1

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

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

public static object GetPropertyName(object target) 

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

public static void SetPropertyName(object target, object value) 

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

Смежные вопросы