Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF TreeView如何指定与子节点源相同类型的多个属性_C#_Wpf_Xaml_Treeview - Fatal编程技术网

C# WPF TreeView如何指定与子节点源相同类型的多个属性

C# WPF TreeView如何指定与子节点源相同类型的多个属性,c#,wpf,xaml,treeview,C#,Wpf,Xaml,Treeview,我有一个需要绑定到Treeview的规则类列表,但Treeview节点的层次结构应该是这样的 如果 --IF2 --埃尔塞伊夫 ----IF3 --否则 ----如果4 这是规则类 public class Rule { private List<RuleTag> elseIf = new List<RuleTag>(); public RuleTag IF { get; set; } public RuleTag Else { get; set

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

如果
--IF2
--埃尔塞伊夫
----IF3
--否则
----如果4

这是规则类

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() { }
}
公共类规则
{
私有列表elseIf=新列表();
如果{get;set;}
公共规则标签Else{get;set;}
公共列表
{
获取{return elseIf;}
}
公共规则(){}
}
规则标签定义如下

public class RuleTag
{
    private List<Rule> children = new List<Rule>();

    public List<Rule> Children
    {
        get { return children; }
        set { children = value; }
    }

    public RuleTag() { }
}
公共类规则标签
{
私有列表子项=新列表();
公开儿童名单
{
获取{返回子项;}
设置{children=value;}
}
公共规则标记(){}
}
在上面的示例中,IF2是Rule.ElseIF[0]的成员IF.Children,ElseIF是Rule.ElseIF[0](如果数组中有多个ElseIF,则所有需要显示),IF3是Rule.ElseIF[0]的成员Children,IF4是Rule.Else.Children的成员

我尝试过HierarchycalDataTemplate,但我只能绑定到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>

尝试使用两个级别的分层数据模板,如下所示:

<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
{
私有ObservableCollection elseIf=新ObservableCollection();
私有规则标签_else;
私有CompositeCollection子项=新CompositeCollection();
如果{get;set;}
公共规则标签Else
{
获取{return\u else;}
设置
{
_else=价值;
财产变更(“子女”);
}
}
公共可观测集合ElseIf
{
获取{return elseIf;}
}
公共合成集合儿童
{
得到
{
儿童。清除();
Add(new CollectionContainer(){Collection=IF.children});
Add(new CollectionContainer(){Collection=ElseIf});
if(Else!=null)
儿童。添加(其他);
返回儿童;
}
}
公共事件属性更改事件处理程序属性更改;
受保护的void OnPropertyChanged(字符串名称)
{
PropertyChangedEventHandler处理程序=PropertyChanged;
if(处理程序!=null)
{
处理程序(此,新PropertyChangedEventArgs(名称));
}
}
}

注意,我现在还实现了INotifyPropertyChanged接口,这是因为类中的else部分不是集合。现在,在实例化规则类时,如果Else为空,则不会将其添加到CompositeCollection,但如果稍后设置,则我会通知CompositeCollection的所有观察者此属性已更改。此外,我已经制作了所有列表,例如IF.Childre,List observatablecollection

我使用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
{
私有ObservableCollection elseIf=新ObservableCollection();
私有规则标签_else;
私有CompositeCollection子项=新CompositeCollection();
如果{get;set;}
公共规则标签Else
{
获取{return\u else;}
设置
{
_else=价值;
财产变更(“子女”);
}
}
公共可观测集合ElseIf
{
获取{return elseIf;}
}
公共合成集合儿童
{
得到
{
儿童。清除();
Add(new CollectionContainer(){Collection=IF.children});
Add(new CollectionContainer(){Collection=ElseIf});
if(Else!=null)
儿童。添加(其他);
返回儿童;
}
}
公共事件属性更改事件处理程序属性更改;
受保护的void OnPropertyChanged(字符串名称)
{
PropertyChangedEventHandler处理程序=PropertyChanged;
if(处理程序!=null)
{
处理程序(此,新PropertyChangedEventArgs(名称));
}
}
}

注意,我现在还实现了INotifyPropertyChanged接口,这是因为类中的else部分不是集合。现在,在实例化规则类时,如果Else为空,则不会将其添加到CompositeCollection,但如果稍后设置,则我会通知CompositeCollection的所有观察者此属性已更改。此外,我已经制作了所有列表,例如IF.Childre,List observativecollection

我没有尝试过这种方法,但使用CompositeCollection解决了我的问题我没有尝试过这种方法,但使用CompositeCollection解决了我的问题我没有尝试过这种方法,但使用CompositeCollection解决了我的问题