如何指定多个相同类型的属性作为子节点的源

本文关键字:属性 子节点 同类型 何指定 | 更新日期: 2023-09-27 17:54:49

我有一个需要绑定到Treeview的规则类列表,但Treeview节点的层次结构应该是这样的

如果
——如果
——ElseIF
——IF3
——其他
——IF4

下面是Rule类
public class Rule
{
    private List<RuleTag> elseIf = new List<RuleTag>();
    public RuleTag IF { get; set; }
    public RuleTag Else { get; set; }
    public List<RuleTag> ElseIf
    {
        get { return elseIf; }
    }
    public Rule() { }
}

规则标签定义在

下面
public class RuleTag
{
    private List<Rule> children = new List<Rule>();
    public List<Rule> Children
    {
        get { return children; }
        set { children = value; }
    }
    public RuleTag() { }
}

在上面的例子中,IF2是IF成员。孩子们,爱就是规则。ElseIF[0](如果数组中有多个ElseIF需要全部显示),IF3是Rule.ElseIf[0]的成员。child和IF4是Rule.Else.Children

的成员

我已经尝试了HierarchicalDataTemplate,但我只能绑定到IF的子,无法显示Else和ElseIF作为子

这是我的XAML
<TreeView.Resources>
    <HierarchicalDataTemplate DataType="{x:Type TangoRules:Rule}" ItemsSource="{Binding IF.Children}">
        <TextBlock Text="IF" />
    </HierarchicalDataTemplate>
</TreeView.Resources>

如何指定多个相同类型的属性作为子节点的源

尝试使用两个级别的分层数据模板:

<HierarchicalDataTemplate ItemsSource="{Binding RuleCollection}">
            <TextBlock Text="{Binding IF}" />                       
            <HierarchicalDataTemplate.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding Children}">
                    <HierarchicalDataTemplate.ItemTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding}" />
                        </DataTemplate>
                    </HierarchicalDataTemplate.ItemTemplate>                   
                </HierarchicalDataTemplate>
            </HierarchicalDataTemplate.ItemTemplate>
        </HierarchicalDataTemplate>

我使用CompositeCollection通过修改下面的规则类来解决这个问题

public class Rule : INotifyPropertyChanged
{
    private ObservableCollection<RuleTag> elseIf = new ObservableCollection<RuleTag>();
    private RuleTag _else;
    private CompositeCollection children = new CompositeCollection();
    public RuleTag IF { get; set; }
    public RuleTag Else
    {
        get { return _else; }
        set
        {
            _else = value;
            OnPropertyChanged("Children");
        }
    }
    public ObservableCollection<RuleTag> ElseIf
    {
        get { return elseIf; }
    }
    public CompositeCollection Children
    {
        get
        {
            children.Clear();
            children.Add(new CollectionContainer() { Collection = IF.Children });
            children.Add(new CollectionContainer() { Collection = ElseIf });
            if (Else != null)
                children.Add(Else);
            return children;
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(string name)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(name));
        }
    }
}

注意,我现在还实现了INotifyPropertyChanged接口,这是因为类中的else部分不是一个集合。现在,当Rule类实例化时,如果Else为空,则不会添加到CompositeCollection,但如果稍后设置,我会通知CompositeCollection的所有观察者此属性已更改。此外,我已经列好了所有的清单。