2015-01-16 2 views
0

Я создал связанные свойства зависимостей на статическом типе (DataField). Среди них есть Owner и Name. Они могут быть прикреплены к любому экземпляру DependencyObject.Правильный способ создания пути свойств для динамически созданного объекта привязки?

На некоторых элементах управления, такие как TextBox я хочу дополнительное поведение для этих вложенных свойств, так что я перекрытая метаданные из другого статического типа:

static void OverrideDataFieldMetaData() 
{ 
    //... 
    DataField.NameProperty.OverrideMetadata(typeof(TextBox), new UIPropertyMetadata(new PropertyChangedCallback(OnFieldNameChanged))); 
    //... 
} 

В OnFieldNameChanged методе, который я хочу, чтобы динамически создать Binding объект и установить это на СЧПУ Text собственности:

//... 

private static void OnFieldNameChanged(DependencyObject o, DependencyPropertyChangedEventArgs e) 
{ 
    OnFieldNameChanged((TextBox)o, (string)e.OldValue, (string)e.NewValue); 
} 

private static void OnFieldNameChanged(TextBox tb, string oldValue, string newValue) 
{ 
    if (string.IsNullOrWhiteSpace(newValue)) 
     BindingOperations.ClearBinding(tb, TextBox.TextProperty); 
    else 
    { 
     // PROBLEM HERE! 
     var binding = new Binding("(fc:DataField.Owner)." + newValue); 

     binding.Source = tb; 

     tb.SetBinding(TextBox.TextProperty, binding); 
    } 
} 

Это где я застрял. Как я должен создать этот объект Binding с правильной схемой маршрута?

Прямо сейчас, код выше бросает TypeNameParserException. Я думаю, что я понимаю, почему это происходит, но даже если это не так, что если по какой-то причине я определил другой префикс для пространства имен в содержащем Window/UserControl?

ответ

1

Вы можете попробовать это:

Binding b = new Binding(); 
b.Path = new PropertyPath("(0)", DataField.OwnerProperty); 

В коде позади вас не требуется определение пространства имен, так как у вас есть прямой ссылка на вашу собственность.

https://srndolha.wordpress.com/2008/01/11/wpf-binding-to-a-custom-attached-property-in-code/

+0

Вам не нужно перезагружать привязку. В этом весь смысл привязки: p –

+0

Так что 'DataField.Owner' в моем случае будет' DataField.OwnerProperty', так как 'PropertyPath' примет фактический экземпляр DependencyProperty, а не сам экземпляр владельца. Я прав? – Crono

+0

@Crono: Да, я исправил опечатку. –

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