C# WPF TreeView如何指定与子节点源相同类型的多个属性
我有一个需要绑定到Treeview的规则类列表,但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
--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解决了我的问题