Pergunta

Estou criando um UserControl para um TreeView rico (um que possui menus de contexto para renomear nós, adicionar nós filhos, etc.).Quero poder usar esse controle para gerenciar ou navegar em qualquer estrutura de dados hierárquica que irei criar.Atualmente estou trabalhando para qualquer estrutura de dados que implemente a seguinte interface (a interface não precisa realmente ser implementada, no entanto, apenas a presença desses membros é necessária):

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

Então, no meu UserControl, eu uso modelos para vincular minha árvore à estrutura de dados, assim:

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

O que eu gostaria de fazer é definir o nome de cada um desses membros no meu RichTreeView, permitindo que ele se adapte a uma variedade de estruturas de dados diferentes, assim:

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

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

Existe alguma maneira de expor o caminho de uma ligação dentro de um UserControl como uma propriedade pública desse UserControl?Existe alguma outra maneira de resolver esse problema?

Foi útil?

Solução

Talvez isso possa ajudar:

Crie um novo Binding ao definir a propriedade HeaderProperty na propriedade de dependência Header:

A propriedade Header é sua DependencyProperty normal do dia a dia:

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

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

e a propriedade do seu HeaderProperty funciona da seguinte maneira:

    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 é sua DependencyProperty normal do dia a dia, com um método que é invocado assim que HeaderProperty muda.Portanto, quando ele muda, ele cria uma ligação no Header que será vinculada ao caminho que você definiu em HeaderProperty.:)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top