2008-08-14 4 views
5

Я создаю UserControl для богатого TreeView (тот, который имеет контекстные меню для переименования узлов, добавления дочерних узлов и т. Д.). Я хочу иметь возможность использовать этот элемент управления для управления или навигации по любым иерархическим структурам данных, которые я создам. Я в настоящее время он работает для любой структуры данных, которая реализует следующий интерфейс (интерфейс не должен быть фактически реализован, однако, только присутствие этих элементов требуется):Переменные привязки в WPF

interface ITreeItem 
{ 
    string Header { get; set; } 
    IEnumerable Children { get; } 
} 

Тогда в моем UserControl, я использую шаблоны чтобы связать мое дерево структуры данных, например, так:

<TextBlock x:Name="HeaderTextBlock" Text="{Binding Path=Header}" /> 

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

class MyItem 
{ 
    string Name { get; set; } 
    ObservableCollection<MyItem> Items; 
} 

<uc:RichTreeView ItemSource={Binding Source={StaticResource MyItemsProvider}} 
    HeaderProperty="Name" ChildrenProperty="Items" /> 

Есть ли способ открыть путь привязки в UserControl как общедоступное свойство этого UserControl? Есть ли другой способ решения этой проблемы?

ответ

2

Возможно, это могло бы помочь:

Создать новую Binding, когда вы устанавливаете свойство HeaderProperty на свойстве заголовка зависимостей:

Header свойство является вашей обычной повседневной DependencyProperty:

public string Header 
    { 
     get { return (string)GetValue(HeaderProperty); } 
     set { SetValue(HeaderProperty, value); } 
    } 

    public static readonly DependencyProperty HeaderProperty = 
     DependencyProperty.Register("Header", typeof(string), typeof(ownerclass)); 

и имущество вашего HeaderProperty работает следующим образом:

public static readonly DependencyProperty HeaderPropertyProperty = 
     DependencyProperty.Register("HeaderProperty", typeof(string), typeof(ownerclass), new PropertyMetadata(OnHeaderPropertyChanged)); 

    public string HeaderProperty   
    { 
     get { return (string)GetValue(HeaderPropertyProperty); } 
     set { SetValue(HeaderPropertyProperty, value); } 
    } 

    public static void OnHeaderPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) 
    { 
     if (args.NewValue != null) 
     { 
      ownerclass c = (ownerclass) obj; 

      Binding b = new Binding(); 
      b.Path = new PropertyPath(args.NewValue.ToString()); 
      c.SetBinding(ownerclass.HeaderProperty, b); 
     } 
    } 

HeaderProperty - ваш обычный повседневный DependencyProperty, с методом, который вызывается, как только изменяется HeaderProperty. Поэтому, когда он изменяется, он создает привязку в заголовке, которая привязывается к пути, установленному в HeaderProperty. :)

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