如何在C#.net 2010
中显示类似这样的组合框答案 0 :(得分:0)
可以通过在一个UserControl中组合两个控件ComboBox和TreeView来实现。
虽然这种控制看起来很简单,但实际的实现并不清楚,需要很长时间。 以下是一系列步骤:
1)自定义TreeView
和TreeViewItem
。它们提供以下功能:
允许展开并从视图模型中选择一个项目(无法使用其他方式选择TreeView
的项目)
用户点击TreeViewItem
时触发的事件(因此可以关闭ComboBox
)
2)ItemsSource
集合
public interface ITreeViewItemModel
{
string SelectedValuePath { get; }
string DisplayValuePath { get; }
bool IsExpanded { get; set; }
bool IsSelected { get; set; }
IEnumerable<ITreeViewItemModel> GetHierarchy();
IEnumerable<ITreeViewItemModel> GetChildren();
}
此界面的成员:
IsExpanded
- 允许从绑定视图模型中展开TreeViewItem
。必须实现为INotifyPropertyChanged
属性。
IsSelected
- 允许从绑定视图模型中选择TreeViewItem
。必须实现为INotifyPropertyChanged
属性。
SelectedValuePath
- 将用于选择和展开树视图控件的唯一字符串(唯一项ID)。
DisplayValuePath
- 组合框关闭时将在标题中显示的内容
GetHierarchy
- 返回项目及其父项。
GetChildren
- 返回当前项目的子项目
这是实施中最困难的部分。我被迫创建了许多方法来提供Combobox
和TreeView
之间的联系。
但是,尽管有许多私有方法,但只有两个公共属性:
SelectedItem
- 现在可以获取或设置此项目,它将在树视图中被选中。
SelectedHierarchy
- 没有必要创建这个属性,但这并不难,所以我决定实现它。使用字符串列表而不是实际项目。
<UserControl.Resources>
<Windows:HierarchicalDataTemplate x:Key="treeViewDataTemplate"
ItemsSource="{Binding Children}">
<TextBlock Text="{Binding Title}" />
</Windows:HierarchicalDataTemplate>
</UserControl.Resources>
<Grid x:Name="LayoutRoot" Background="White">
<local:ComboBoxTreeView ItemsSource="{Binding Items}"
SelectedItem="{Binding SelectedItem}"
ItemTemplate="{StaticResource treeViewDataTemplate}"
HorizontalAlignment="Center" VerticalAlignment="Top" />
</Grid>
ItemTemplate
属性是强制性属性,必须属于HierarchicalDataTemplate
类型。
查看https://vortexwolf.wordpress.com/2011/04/29/silverlight-combobox-with-treeview-inside/