如何指定多个相同类型的属性作为子节点的源
本文关键字:属性 子节点 同类型 何指定 | 更新日期: 2023-09-27 17:54:49
我有一个需要绑定到Treeview的规则类列表,但Treeview节点的层次结构应该是这样的
如果
——如果
——ElseIF
——IF3
——其他
——IF4
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的所有观察者此属性已更改。此外,我已经列好了所有的清单。