在ComboBox中嵌套TreeView控件,有时候我们在设计界面的时候,由于界面设计的需要,我们需要将TreeView控件嵌套在ComboBox中,因为TreeView控件实在是太占用地方了,要想实现这样的功能,我们需要修改ComboBox控件的模板,这里贴出相关的代码,并进行分析:既然要将TreeView嵌套到ComboBox中,那么我们必须要修改ComboBoxItem的模板,在这里我们修改 ComboBoxItem的控件模板,同时我们也需要修改TreeView的ItemTemplate模板,我们定义了两部分,左边的部分是一个宽和高都为13 的小正方体,里面通过Path属性画上了一个对勾,这个是模拟CheckBox属性来定义的,并且通过代码来改变其Visibility属性。然后再定义一个TextBlock,用于显示文字部分,在这里我们同时使用了HierarchicalDataTemplate(分层数据模板),这个模板是使用非常多的一种模板。

 1 <ComboBox x:Name="comboBox" SelectionChanged="comboBox_SelectionChanged">
2 <ComboBoxItem Content="{Binding Name}" Visibility="Collapsed"/>
3 <ComboBoxItem x:Name="comTree" FocusVisualStyle="{x:Null}">
4 <ComboBoxItem.Template>
5 <ControlTemplate>
6 <TreeView Name="treeView" ItemsSource="{Binding TreeViewItems}" SelectedValuePath="DataName" DisplayMemberPath="DataName" Margin="0" SelectedItemChanged="treeView_SelectedItemChanged" BorderThickness="0">
7 <TreeView.ItemTemplate>
8 <HierarchicalDataTemplate ItemsSource="{Binding Items}">
9 <StackPanel Orientation="Horizontal" Margin="0,1">
10 <Grid Height="13" Width="13" VerticalAlignment="Center" Margin="2,0,0,0">
11 <Border BorderBrush="#5c8200" BorderThickness="1"/>
12 <Path Stroke="#5c8200" StrokeThickness="1" Data="M 2,7 5,11 11,2" Visibility="{Binding Visibility}"/>
13 </Grid>
14 <TextBlock Text="{Binding Name}" Margin="2,0,0,0"/>
15 </StackPanel>
16 </HierarchicalDataTemplate>
17 </TreeView.ItemTemplate>
18 </TreeView>
19 </ControlTemplate>
20 </ComboBoxItem.Template>
21 </ComboBoxItem>
22 </ComboBox>   

在后台中我们需要封装一些类,这些类分别来实现不同的功能,首先是TreeData这个类,这个类主要是用来封装一些重要的属性,即每个TreeView的节点应该包含哪些数据,注意这个类必须实现INotifyPropertyChanged接口,并定义下面的事件和方法,以便在数据源更改时,能够将数据同步更新到UI,这个在使用时需要注意。

public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string prop)
{
  if (this.PropertyChanged != null)
  this.PropertyChanged(this, new PropertyChangedEventArgs(prop));
}  

另外,我们需要定义另外一个类 ViewModel类,用于初始化需要绑定到前台的数据,这是一个很典型的MVVM设计模式,在使用的时候需要特别注意,很多时候我们需要采用这种方式来实现前台和后台数据的绑定,当然我们也可以在该类中定义一些我们需要的数据和属性。

另外在我们的工程中,由于更改了ComboBox的样式,所以我们定义了一个用户控件,所有与combobox相关的操作都是在这个类中进行的,在MainWindow中我们只需要将这个用户控件引入到其中就可以了,关于这些设计其中的妙处,只有我们去细心领悟才能真正地体会到。另外整个工程中,非常重要的一个部分就是,当我们点击了TreeView节点之后,需要将数据反映到combobox上面,所以我们在ComboBox中添加了一个ComboBoxItem,这个就是  <ComboBoxItem Content="{Binding Name}" Visibility="Collapsed"/>,这个ComboBoxItem默认的状态是隐藏的,这个ComboBoxItem的Content属性是和Name属性绑定在一起的,当我们选择了TreeView的某一个节点之后,我们会把当前节点的Content值赋值给该Name属性,并且让ComboBox的 this.comboBox. SelectedIndex = 0;这样当我们点击了TreeView某个节点之后,就能是ComboBox显示当前节点名称,这里面涉及到两个重要的事件,下面贴出代码仅供参考。

private void treeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
if (this.selectedItem != null)
this.selectedItem.Visibility = Visibility.Collapsed;
this.SelectedItem = e.NewValue as TreeData;
} private void comboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
this.comboBox.SelectedIndex = 0;
}  

这里我们定义了一个数SelectedItem属性。

/// <summary>
/// 当前选中项的Data
/// </summary>
public TreeData SelectedItem
{
get { return selectedItem; }
set
{
selectedItem = value;
dataModel.ViewModeName = value.Name;
value.Visibility = Visibility.Visible;
}
}    

其它的细节部分请参考整个工程。

ComboBox中如何嵌套TreeView控件的更多相关文章

  1. WinForm开发中针对TreeView控件改变当前选择节点的字体与颜色

    本文转载:http://www.cnblogs.com/umplatform/archive/2012/08/29/2660240.html 在B/S开发中,对TreeView控件要改变当前选中节点的 ...

  2. TreeView控件的展开与折叠

    在窗体中添加一个TreeView控件,设置CheckBox属性为True,绑定数据 Archive jkj = new Archive();//自定义类        public void Bind ...

  3. WPF中TreeView控件SelectedItemChanged方法的MVVM绑定

    问题描述:左侧treeview控件中点击不同类别的节点时,右侧的页面会显示不同的权限.比如对于My Publications,拥有Modify和Delete两种权限,对于My Subscription ...

  4. WPF中TreeView控件数据绑定和后台动态添加数据(二)

    写在前面:在(一)中,介绍了TreeView控件MVVM模式下数据绑定的方法.在这篇文章中,将总结给节点添加事件的方法,这样说有些不对,总之实现的效果就是点击某个节点,将出现对应于该节点的页面或者数据 ...

  5. WPF中TreeView控件数据绑定和后台动态添加数据(一)

    数据绑定: 更新内容:补充在MVVM模式上的TreeView控件数据绑定的代码. xaml代码: <TreeView Name="syntaxTree" ItemsSourc ...

  6. Win32中TreeView控件的使用方法,类似于资源管理器中文件树形显示方式

    首先是头文件,内容如下: #include <tchar.h> #include "..\CommonFiles\CmnHdr.h" #include <Wind ...

  7. C#Winform中treeView控件使用总结

    1.如何展开结点时改变图标(注意:不是选中时) 要在目录中使用图标首先要加入一个控件ImageList(命名为imageList1),然后可以按图片的index或名称引用图片. 然后需要在TreeVi ...

  8. winfrom窗体中嵌套WPF控件

    前言 本文主要介绍如何在winfrom窗体中嵌套WPF控件, 一来是自己记录一下,而来希望能对有需要的朋友提供实现思路. 如有错误请指出...下面进入正题... -1.前期准备 准备一个建立好的win ...

  9. WPF中TreeView控件的使用案例

    WPF总体来说还是比较方便的,其中变化最大的主要是Listview和Treeview控件,而且TreeView似乎在WPF是一个备受指责的控件,很多人说他不好用.我这个demo主要是在wpf中使用Tr ...

随机推荐

  1. 卸载ros的方法

    1)卸载全部ros: sudo apt-get autoremove --purge ros-* 卸载某个ros版本(ros版本可以共存,每次需要切换) 如indigo:   sudo apt-get ...

  2. Android学习之基础知识四-Activity活动6讲(体验Activity的生命周期)

    一.体验活动的生命周期的执行 代码组成: 1.三个Java类:MainActivity.java.NormalActivity.java.DialogActivity.java 2.三个布局文件:ac ...

  3. Luogu3676 小清新数据结构题 动态点分治

    传送门 换根类型的统计问题动态点分治都是很好做的. 设所有点的点权和为$sum$ 首先,我们先不考虑求$\sum\limits_i s_i^2$,先考虑如何在换根的情况下求$\sum\limits_i ...

  4. Luogu4609 FJOI2016 建筑师 第一类斯特林数

    题目传送门 题意:给出$N$个高度从$1$到$N$的建筑,问有多少种从左往右摆放这些建筑的方法,使得从左往右看能看到$A$个建筑,从右往左看能看到$B$个建筑.$N \leq 5 \times 10^ ...

  5. 【php增删改查实例】第十一节 - 部门管理模块(编辑功能)

    9. 编辑部门功能的实现 思路:只允许用户勾选一条数据,点击编辑按钮,会跳出一个和新增数据类似的对话框.然后,用户可以修改部门名称和部门编码.点击保存按钮,提示修改成功. 9.1 前台代码编写 < ...

  6. 【强化学习】python 实现 q-learning 例一

    本文作者:hhh5460 本文地址:https://www.cnblogs.com/hhh5460/p/10134018.html 问题情境 -o---T# T 就是宝藏的位置, o 是探索者的位置 ...

  7. KMeans算法分析以及实现

    KMeans KMeans是一种无监督学习聚类方法, 目的是发现数据中数据对象之间的关系,将数据进行分组,组内的相似性越大,组间的差别越大,则聚类效果越好. 无监督学习,也就是没有对应的标签,只有数据 ...

  8. 使用 cron 定时任务实现 war 自动化发布

    autoRelease.sh #!/bin/sh /home/tomcat/bin/shutdown.sh echo "tomcat stoped" cd /home/tomcat ...

  9. .net core实践系列之短信服务-Api的SDK的实现与测试

    前言 上一篇<.net core实践系列之短信服务-Sikiro.SMS.Api服务的实现>讲解了API的设计与实现,本篇主要讲解编写接口的SDK编写还有API的测试. 或许有些人会认为, ...

  10. 阿里云Https通配符证书购买

    先付款,再绑定证书. 会款后会审核,等待... DNS解析配置错误 按域名授权配置,增加一条 DNS Txt记录值.