带子菜单的组合框

时间:2015-01-22 11:19:53

标签: combobox submenu

Combo box

如何在C#.net 2010

中显示类似这样的组合框

1 个答案:

答案 0 :(得分:0)

可以通过在一个UserControl中组合两个控件ComboBox和TreeView来实现。

虽然这种控制看起来很简单,但实际的实现并不清楚,需要很长时间。 以下是一系列步骤:

1)自定义TreeViewTreeViewItem。它们提供以下功能: 允许展开并从视图模型中选择一个项目(无法使用其他方式选择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 - 返回当前项目的子项目

  1. 创建组合框:
  2. 这是实施中最困难的部分。我被迫创建了许多方法来提供ComboboxTreeView之间的联系。 但是,尽管有许多私有方法,但只有两个公共属性:

    SelectedItem - 现在可以获取或设置此项目,它将在树视图中被选中。

    SelectedHierarchy - 没有必要创建这个属性,但这并不难,所以我决定实现它。使用字符串列表而不是实际项目。

    1. 将其添加到视图并与视图模型绑定:
      <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>
    2. ItemTemplate属性是强制性属性,必须属于HierarchicalDataTemplate类型。

      查看https://vortexwolf.wordpress.com/2011/04/29/silverlight-combobox-with-treeview-inside/