WPF中的变量绑定

时间:2020-03-05 18:39:43  来源:igfitidea点击:

我为一个丰富的TreeView创建了一个UserControl(该控件具有用于重命名节点,添加子节点等的上下文菜单)。我希望能够使用此控件来管理或者导航我将创建的任何分层数据结构。我目前可以将其用于实现以下接口的任何数据结构(该接口实际上不需要实现,但是仅需要这些成员的存在):

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的公共属性?还有其他解决方法吗?

解决方案

回答

也许这可能会有所帮助:

在Header依赖项属性上设置HeaderProperty属性时,请创建一个新的Binding:

标头属性是我们日常的日常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更改后立即被调用。因此,当它更改时,它将在Header上创建一个绑定,该绑定将绑定到我们在HeaderProperty中设置的路径。 :)