2008-08-14 6 views
5

Estoy creando un UserControl para una rica TreeView (una que tiene menús de contexto para cambiar el nombre de los nodos, agregar nodos secundarios, etc.). Deseo poder utilizar este control para administrar o navegar por cualquier estructura de datos jerárquica que crearé. En este momento tengo que trabajar para cualquier estructura de datos que implementa la interfaz siguiente (la interfaz no necesita realmente ser implementado, sin embargo, sólo se requiere la presencia de estos miembros):Vinculaciones de variable en WPF

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

Luego, en mi control de usuario, uso de plantillas para unir mi árbol de la estructura de datos, así:

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

lo que me gustaría hacer es definir el nombre de cada uno de estos miembros en mi RichTreeView, que le permite adaptarse a una variedad de diferentes estructuras de datos, como ese:

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

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

¿Hay alguna manera de exponer la ruta de una vinculación dentro de un UserControl como una propiedad pública de ese UserControl? ¿Hay alguna otra forma de resolver este problema?

Respuesta

2

Tal vez esto podría ayudar:

Crear una nueva encuadernación Cuando se establece la propiedad HeaderProperty en la propiedad de dependencia de cabecera:

propiedad de la cabecera es su DependencyProperty cotidiana normal:

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

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

y la propiedad de su HeaderProperty funciona de la siguiente manera:

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 es su propiedad DependencyProperty normal, con un método que se invoca tan pronto como HeaderProperty cambie. Entonces, cuando cambia, crea un enlace en el encabezado que se vinculará a la ruta que establezca en HeaderProperty. :)

Cuestiones relacionadas