Silverlight 中 ComboBox+TreeView 实现的下拉控件

本文介绍了一种结合ComboBox和TreeView的用户控件实现方法,支持数据源双向绑定及递归加载,适用于WPF应用程序。

性能描述:

  ComboBox+TreeView实现的用户控件,设置数据源后,可以递归加载数据,支持双向绑定

  控件截图:

  

 

  XAML界面设计:

<UserControl x:Class="ChuanyeOA.CustomControls.ComboBoxTree"
    xmlns=
"http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x=
"http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d=
"http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc=
"http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable=
"d"
    d:DesignHeight=
"30" d:DesignWidth="300" xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk">
    
    <Grid x:Name="LayoutRoot">
        <ComboBox Height="23" Name="cbMain" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" DropDownOpened="cbMain_DropDownOpened" DropDownClosed="cbMain_DropDownClosed">
            <ComboBoxItem x:Name="cbItemTreeView">
                <ComboBoxItem.Content>
                    <sdk:TreeView Name="tvList" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" SelectedItemChanged="tvList_SelectedItemChanged" />
                </ComboBoxItem.Content>
            </ComboBoxItem>

            <ComboBoxItem x:Name="cbItemDisplay" >
            </ComboBoxItem>
        </ComboBox>
    </Grid>
</UserControl>

  后台CS代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

using System.Windows.Data;

using System.Collections;
using System.Reflection;

/********************************
 * 创建人:刘跃飞
 * 创建时间:2010-09-21
 * 功能描述:ComboBox+TreeView实现的用户控件,主要实现选择TreeView中的项做为ComboBox的项的功能
 * 属性描述:此控件包含以下几个属性
 * 1.ItemsSource:控件要绑定的数据源
 * 2.SelectedValuePath:选中的值的属性
 * 3.DisplayMemberPath:获取或设置为每个数据项要显示的属性的名称
 * 4.SelectedItem  当前选择的项
 * 5.SelectedValue  当前选择的值
 * 6.IsRecursionEnabled 设置是否启用递归加载数据源中的项 。需要设置ChildName和ParentName两个属性
 * 7.ChildMemberPath 递归加载数据源时,实体中的子级属性项
 * 8. ParentMemberPath 递归加载数据源时,实体中的父级属性项
 * 9.IsExpandAll 设置TreeView打开时是全部打开状态还是收缩状态 默认为True打开状态
 * 
 * 使用方法:
 * 注意事项:本控件设计尚不完善,【ItemsSource】属性需要在最后设置,否则,将提示错误
 * 1.界面上直接设置,例如:
 *  <myControl:ComboBoxTree SelectedValue="{Binding DepartmentID, Mode=TwoWay}" DisplayMemberPath="DepartName" SelectedValuePath="ID" IsRecursionEnabled="True" ChildMemberPath="ID" ParentMemberPath="ParentID"  ItemsSource="{Binding Data, Source={StaticResource a_DepartmentDomainDataSource}}">
 * 2.在后台代码中直接设置,例如:
 *           comboBoxTree1.DisplayMemberPath = "Name";
 *           comboBoxTree1.SelectedValuePath = "ID";
 *           comboBoxTree1.ChildMemberPath = "ID";
 *           comboBoxTree1.ParentMemberPath = "ParentID";
 *           comboBoxTree1.IsRecursionEnabled = true;
 *           comboBoxTree1.ItemSource = MyControls.DepartmentInfo.GetDepartment().AsEnumerable();
 * 3.如果启用递归加载,父级ID为【0】的项,将作为根节点加载,如果没有父级ID为【0】的项,将无法进行加载
 * 4.此控件用到了TreeView的ExpandAll扩展方法,需要添加【System.Windows.Controls.Toolkit】类库的引用,否则将提示找不到此方法
 * ***********************************/


namespace ChuanyeOA.CustomControls
{
    public partial class ComboBoxTree : UserControl
    {      
        public ComboBoxTree()
        {
            InitializeComponent();

            this.LayoutUpdated += new EventHandler(ComboBoxTree_LayoutUpdated);
        }

        void ComboBoxTree_LayoutUpdated(object sender, EventArgs e)
        {
            if (this.IsExpandAll)
            {
                //--展开所有节点
                tvList.ExpandAll();
            }
        }

        #region ItemSource 设置或获得绑定的数据源(属性)
        
        public static readonly DependencyProperty ItemsSourceProperty =
            DependencyProperty.Register("ItemsSource"typeof(IEnumerable), typeof(ComboBoxTree), new PropertyMetadata(new PropertyChangedCallback(ItemsSourcePropertyChangedCallBack)));
        /// <summary>
        /// 数据源
        /// </summary>
        public IEnumerable ItemsSource
        {
            get
            {
                return (IEnumerable)this.GetValue(ItemsSourceProperty);
            }
            set
            {
                this.SetValue(ItemsSourceProperty, value);
            }
        }
        //--属性更改的回调事件
        public static void ItemsSourcePropertyChangedCallBack(DependencyObject sender, DependencyPropertyChangedEventArgs args)
        {
            if (sender != null)
            {
                ComboBoxTree comboBoxTree = sender as ComboBoxTree;

                if (comboBoxTree.IsRecursionEnabled == false)
                {
                    // 以列表的方式加载数据
                    comboBoxTree.LoadTreeViewDataWithList();
                }
                else
                {
                    //以递归的方式加载数据
                    comboBoxTree.LoadTreeViewDataWithRecursion();
                }

            }
        }

内容概要:本文档是一份关于交换路由配置的学习笔记,系统地介绍了网络设备的远程管理、交换机与路由器的核心配置技术。内容涵盖Telnet、SSH、Console三种远程控制方式的配置方法;详细讲解了VLAN划分原理及Access、Trunk、Hybrid端口的工作机制,以及端口镜像、端口汇聚、端口隔离等交换技术;深入解析了STP、MSTP、RSTP生成树协议的作用与配置步骤;在路由部分,涵盖了IP地址配置、DHCP服务部署(接口池与全局池)、NAT转换(静态与动态)、静态路由、RIP与OSPF动态路由协议的配置,并介绍了策略路由和ACL访问控制列表的应用;最后简要说明了华为防火墙的安全区域划分与基本安全策略配置。; 适合人群:具备一定网络基础知识,从事网络工程、运维或相关技术岗位1-3年的技术人员,以及准备参加HCIA/CCNA等认证考试的学习者。; 使用场景及目标:①掌握企业网络中常见的交换与路由配置技能,提升实际操作能力;②理解VLAN、STP、OSPF、NAT、ACL等核心技术原理并能独立完成中小型网络搭建与调试;③通过命令示例熟悉华为设备CLI配置逻辑,为项目实施和故障排查提供参考。; 阅读建议:此笔记以实用配置为主,建议结合模拟器(如eNSP或Packet Tracer)动手实践每一条命令,对照拓扑理解数据流向,重点关注VLAN间通信、路由选择机制、安全策略控制等关键环节,并注意不同设备型号间的命令差异。
多旋翼无人机组合导航系统-多源信息融合算法(Matlab代码实现)内容概要:本文围绕多旋翼无人机组合导航系统,重点介绍了基于多源信息融合算法的设计与实现,利用Matlab进行代码开发。文中采用扩展卡尔曼滤波(EKF)作为核心融合算法,整合GPS、IMU(惯性测量单元)、里程计和电子罗盘等多种传感器数据,提升无人机在复杂环境下的定位精度与稳定性。特别是在GPS信号弱或丢失的情况下,通过IMU惯导数据辅助导航,实现连续可靠的位姿估计。同时,文档展示了完整的算法流程与Matlab仿真实现,涵盖传感器数据预处理、坐标系转换、滤波融合及结果可视化等关键环节,体现了较强的工程实践价值。; 适合人群:具备一定Matlab编程基础和信号处理知识,从事无人机导航、智能控制、自动化或相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于多旋翼无人机的高精度组合导航系统设计;②用于教学与科研中理解多传感器融合原理与EKF算法实现;③支持复杂环境下无人机自主飞行与定位系统的开发与优化。; 阅读建议:建议结合Matlab代码与理论推导同步学习,重点关注EKF的状态预测与更新过程、多传感器数据的时间同步与坐标变换处理,并可通过修改噪声参数或引入更多传感器类型进行扩展实验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值