具有继承类型的 TreeView
TreeView with inherited types
我想显示一个包含实现接口的元素的 TreeView。这个界面主要由两个类实现的,也就是我要显示的
架构类似于:
IElement
Container : IElement
->public IEnumerable<IElement> Elements {get; set;}
Element : IElement
所以基本上,这个 TreeView 必须能够显示任何级别的 Container 和 Element。容器应为 "expandable"(因为它们包含其他 IElement),但元素不应为
因此 this solution 似乎不合适,因为它设置了两个完全不同的级别 (Enterprise/Employees)。
我不知道如何用 IElement 填充 TreeView,同时能够检查它们是容器还是元素,以及如何防止仅扩展其中一种类型。
再添加一个 属性 IsExpandable
类型 bool
到您的 IElement
interface
。将此 属性 设置为 true
仅用于 Container
class 并在 Binding
或 Trigger
中使用此 属性 用于您的 TreeViewItem
.
这是否符合您的要求?
这是一个示例:
CS :
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.DataContext = this;
}
public List<IElement> Elements
{
get
{
var list = new List<IElement>();
list.Add(BuildContainer());
list.Add(BuildContainer());
list.Add(new Element());
return list;
}
}
private Container BuildContainer()
{
var container = new Container();
container.Elements.Add(new Element());
container.Elements.Add(new Element());
var sub_container = new Container();
sub_container.Elements.Add(new Element());
container.Elements.Add(sub_container);
return container;
}
}
public interface IElement
{
string Title { get; }
}
public class Container : IElement
{
public string Title
{
get { return "Container"; }
}
private ObservableCollection<IElement> elements;
public ObservableCollection<IElement> Elements
{
get
{
if (elements == null)
{
elements = new ObservableCollection<IElement>();
}
return elements;
}
}
}
public class Element : IElement
{
public string Title
{
get { return "Element"; }
}
}
XAML :
<Window
xmlns:local="clr-namespace:WpfApplication1"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<DataTemplate DataType="{x:Type local:Element}">
<TextBlock Text="{Binding Title}" Foreground="Red" FontSize="14"/>
</DataTemplate>
<HierarchicalDataTemplate DataType="{x:Type local:Container}" ItemsSource="{Binding Elements}">
<TextBlock Text="{Binding Title}" Foreground="Black" FontWeight="Bold" FontSize="16"/>
</HierarchicalDataTemplate>
</Window.Resources>
<Grid>
<TreeView ItemsSource="{Binding Elements}" />
</Grid>
结果:
我想显示一个包含实现接口的元素的 TreeView。这个界面主要由两个类实现的,也就是我要显示的
架构类似于:
IElement
Container : IElement
->public IEnumerable<IElement> Elements {get; set;}
Element : IElement
所以基本上,这个 TreeView 必须能够显示任何级别的 Container 和 Element。容器应为 "expandable"(因为它们包含其他 IElement),但元素不应为
因此 this solution 似乎不合适,因为它设置了两个完全不同的级别 (Enterprise/Employees)。
我不知道如何用 IElement 填充 TreeView,同时能够检查它们是容器还是元素,以及如何防止仅扩展其中一种类型。
再添加一个 属性 IsExpandable
类型 bool
到您的 IElement
interface
。将此 属性 设置为 true
仅用于 Container
class 并在 Binding
或 Trigger
中使用此 属性 用于您的 TreeViewItem
.
这是否符合您的要求? 这是一个示例:
CS :
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.DataContext = this;
}
public List<IElement> Elements
{
get
{
var list = new List<IElement>();
list.Add(BuildContainer());
list.Add(BuildContainer());
list.Add(new Element());
return list;
}
}
private Container BuildContainer()
{
var container = new Container();
container.Elements.Add(new Element());
container.Elements.Add(new Element());
var sub_container = new Container();
sub_container.Elements.Add(new Element());
container.Elements.Add(sub_container);
return container;
}
}
public interface IElement
{
string Title { get; }
}
public class Container : IElement
{
public string Title
{
get { return "Container"; }
}
private ObservableCollection<IElement> elements;
public ObservableCollection<IElement> Elements
{
get
{
if (elements == null)
{
elements = new ObservableCollection<IElement>();
}
return elements;
}
}
}
public class Element : IElement
{
public string Title
{
get { return "Element"; }
}
}
XAML :
<Window
xmlns:local="clr-namespace:WpfApplication1"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<DataTemplate DataType="{x:Type local:Element}">
<TextBlock Text="{Binding Title}" Foreground="Red" FontSize="14"/>
</DataTemplate>
<HierarchicalDataTemplate DataType="{x:Type local:Container}" ItemsSource="{Binding Elements}">
<TextBlock Text="{Binding Title}" Foreground="Black" FontWeight="Bold" FontSize="16"/>
</HierarchicalDataTemplate>
</Window.Resources>
<Grid>
<TreeView ItemsSource="{Binding Elements}" />
</Grid>
结果: