首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

WPF Datagrid ComboBox选项根据另一个行值而不同

在 WPF 中,如果你希望 DataGrid 中的 ComboBox 选项根据同一行的另一个单元格的值而不同,可以通过绑定和数据模板来实现。以下是一个详细的示例,展示如何实现这一功能。

示例场景

假设你有一个 DataGrid,其中有两列:CategorySubCategorySubCategory 列中的 ComboBox 选项应根据 Category 列的值而变化。

步骤 1: 创建数据模型

首先,创建一个数据模型来表示每一行的数据。

代码语言:javascript
复制
public class Item
{
    public string Category { get; set; }
    public string SubCategory { get; set; }
}

步骤 2: 创建视图模型

创建一个视图模型来管理数据和选项。

代码语言:javascript
复制
public class ViewModel
{
    public ObservableCollection<Item> Items { get; set; }
    public Dictionary<string, List<string>> SubCategories { get; set; }

    public ViewModel()
    {
        Items = new ObservableCollection<Item>
        {
            new Item { Category = "Fruit", SubCategory = "Apple" },
            new Item { Category = "Vegetable", SubCategory = "Carrot" }
        };

        SubCategories = new Dictionary<string, List<string>>
        {
            { "Fruit", new List<string> { "Apple", "Banana", "Orange" } },
            { "Vegetable", new List<string> { "Carrot", "Broccoli", "Spinach" } }
        };
    }
}

步骤 3: 创建数据模板选择器

创建一个数据模板选择器,用于根据 Category 列的值选择不同的 ComboBox 选项。

代码语言:javascript
复制
public class SubCategoryTemplateSelector : DataTemplateSelector
{
    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        var cell = container as FrameworkElement;
        if (cell != null && item != null)
        {
            var itemData = item as Item;
            if (itemData != null)
            {
                var window = Application.Current.MainWindow;
                var viewModel = window.DataContext as ViewModel;

                if (viewModel != null && viewModel.SubCategories.ContainsKey(itemData.Category))
                {
                    var subCategories = viewModel.SubCategories[itemData.Category];
                    var comboBoxTemplate = new DataTemplate();

                    var factory = new FrameworkElementFactory(typeof(ComboBox));
                    factory.SetValue(ComboBox.ItemsSourceProperty, subCategories);
                    factory.SetBinding(ComboBox.SelectedItemProperty, new Binding("SubCategory"));

                    comboBoxTemplate.VisualTree = factory;
                    return comboBoxTemplate;
                }
            }
        }
        return null;
    }
}

步骤 4: 定义 XAML

在 XAML 中定义 DataGrid 和绑定视图模型。

代码语言:javascript
复制
<Window x:Class="WpfApp.MainWindow"
        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"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <local:SubCategoryTemplateSelector x:Key="SubCategoryTemplateSelector" />
    </Window.Resources>
    <Grid>
        <DataGrid ItemsSource="{Binding Items}" AutoGenerateColumns="False">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Category" Binding="{Binding Category}" />
                <DataGridTemplateColumn Header="SubCategory" CellTemplateSelector="{StaticResource SubCategoryTemplateSelector}" />
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>

步骤 5: 设置 DataContext

在代码隐藏文件中设置 DataContext。

代码语言:javascript
复制
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        DataContext = new ViewModel();
    }
}

完整代码

MainWindow.xaml

代码语言:javascript
复制
<Window x:Class="WpfApp.MainWindow"
        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"
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

WPF --- 如何重写WPF原生控件样式?

引言 上一篇中 WPF --- 重写圆角DataGrid样式,因新产品UI需要,重写了一下微软 「WPF」 原生的 DataGrid 的样式,包含如下内容: 基础设置,一些基本背景色,字体颜色等。...重写过程中,遇到了两个问题: 如何获取 「WPF」 原生的 DataGrid 的样式? 滚动条样式中,如何固定滚动条长度? 本篇文章分享一下这两个问题的解决办法。...问题1 第一个,如何获取 「WPF」 原生的 DataGrid 的样式?...这个问题不限于原生的 DataGrid 的样式,其他的一些样式比如 checkBox,RadioButton, ComboBox等。这些控件对于一些初学者来说,很难理解他是怎么实现的。...接下来演示一下如何使用Blend获取 ComboBox 的原生样式。 「第一步:」 使用 Blend 创建一个 WPF 项目,在窗体中添加一个 ComboBox

46620

【愚公系列】2023年10月 WPF控件专题 DataGrid控件详解

WPF控件可以分为两类:原生控件和自定义控件。原生控件是由Microsoft提供的内置控件,如Button、TextBox、Label、ComboBox等。这些控件都是WPF中常见的标准用户界面元素。...自定义控件可以根据需求提供更多的功能和自定义化选项,以及更好的用户体验。一、DataGrid控件详解WPF中的DataGrid是一个非常强大和灵活的控件,它可用于展示和编辑数据。...DataGrid还有许多其他的属性和方法,可以根据需求进行使用。1.属性介绍WPFDataGrid控件的常见属性如下:AutoGenerateColumns:是否自动生成列,默认为true。...数据编辑:DataGrid控件可以支持数据的编辑,包括单元格编辑、编辑和列编辑等方式,方便用户对数据进行修改和更新。...数据排序和筛选:DataGrid控件支持数据的排序和筛选功能,可以根据用户需求方便地对数据进行排序和筛选。

1.2K00
  • 【我们一起写框架】MVVM的WPF框架(三)—数据控件

    注意:TextChangeCallBack委托与TextChanged事件不同,并不是每次修改文字都会触发,而是当TextBox的Text内容真正被修改时,才会触发;我们可以简单的理解为TextBox失去焦点时才会触发...因为WPF的UI控件被创建以后,要被添加到视觉树中,所以最终会被显示在屏幕上的是包裹着控件的视觉树;其中视觉树与控件是可以分离的;比如控件中绑定的数据是10视觉树可以显示3。...很简单,因为ObservableCollection继承了INotifyCollectionChanged,即,数据控件进行[]的增删,也会让UI进行[]的增删。...因为DataGrid数据控件是所有数据控件中最复杂的,而且代码量特别多;所以,我决定,单拿出一篇来介绍DataGrid。 框架代码已经传到Github上了,并且会持续更新。...相关文章: 【我们一起写框架】MVVM的WPF框架(一)—序篇 【我们一起写框架】MVVM的WPF框架(二)—绑定 To be continued——DataGrid Github地址:https://

    2.4K30

    Easyui datagrid combobox输入框非法输入判断与事件总结

    单选Combobox 针对单选Combobox 1、点选 通过点选下拉列表中可选项,并自动收起下拉列表 如果选取项和当前输入框的不一样,会先后触发事件:onSelect -> onChange ->...根据以上规律,我们可以通过是否触发onSelect来区分是否是“手动”输入还是“点选”输入,进而判断输入是否合法:如果是“手动”输入,那就判断输入是否在下拉列表里,否则判断选取值是否和当前combobox...if (rowsSelected == undefined) { // 表明是手动输入的 // 循环遍历下拉列表框的选项,判断输入是否存在选项中...var comboboxData = $(this).combobox('getData'); var if_found = false; // 用于标记输入是否在选项中... 多选Combobox 1、点选 新增未选:点选还没有被选中的选项,先后触发事件: onSelect -> onChange 取消已选:点选已经被选中的选项

    3.4K30

    Easyui datagrid combobox输入框下拉(取消)选和编辑已选处理

    测试环境 jquery-easyui-1.5.3 需求场景 如下,在datagrid中新增、编辑记录: 新增时通过点选指定combobox下拉列表项来实现选择、取消选择所点项(多选combobx:如果输入框中没有该选项...出解决方案之前得先认识下combobox特性 1)如果combobox输入框当前valueField属性和 textField属性可以在下拉列表即通过loadData获取的选项中找到匹配,则才会产生关联...),就等同于未选中选项的情况下,手动点选下拉列表项,会自动触发onSelect事件 3)多选combobox,如果点选下拉列表项,如果点击之前选项已选中,则会取消选中该选项,并去掉combobox中对应项...,则选中该选项,自动触发onSelect事件,并自动在combobx输入框中输入被选项 4)单选combobox(设置combobox为不可编辑,只可点选的情况下做的验证) 如果点击之前选项未选中,则选中该选项...project_id.split(','); var envIDList = rowsSelected[0].environment_id.toString().split(','); // 初始化组件的

    3.3K10

    easy的jsp的增删改查在一个jsp页面上

    id查询出销售合同信息,然后再把这些数据显示出来 ③先用ajax调用后台的根据id查询销售合同列表信息的方法    success:function(data){}            根据修改表格中的每一数据的...id为每一设置                给easyui-textbox文本框赋值   $("#money").textbox('setValue', data.money);             ...({ onLoadSuccess: function(data) { var rows = $('#dg').datagrid('getRows') //获取当前的数据 var ptotal...获取值分两种: 获取字典里的:$("#searchCity").combobox("getText"); 获取数据库里的:$("#searchCustomerId").combobox("getValue...); /* 根据城市查询 */ queryParameter.area = $("#searchCity").combobox("getText"); /* 根据负责人查询 */

    4.6K20

    C# WPF MVVM模式Prism框架下事件发布与订阅

    01 前言 处理同模块不同窗体之间的通信和不同模块之间不同窗体的通信,Prism提供了一种事件机制,可以在应用程序中低耦合的模块之间进行通信,该机制基于事件聚合器服务,允许发布者和订阅者之间通过事件进行通讯...WPF MVVM项目实战(进阶①) C# WPF MVVM项目实战(进阶②) C# WPF框架Caliburn.Micro快速搭建 C# WPF项目实战 C# WPF mvvm模式下combobox绑定...(list、Dictionary) C# WPF MVVM模式下在主窗体显示子窗体并获取结果 C# WPF Caliburn.Micro框架下利用Mef加载其它项目界面...C# WPF文本框TextEdit不以科学计数法显示 C# 通过正则表达式来限制控件输入有效性 C# datagridview、datagrid、GridControl增加行号 C# =>符号的使用...C# 无意间写了一段线程死锁的代码 C# 看懂这100+代码,你就真正入门了(经典) C# WPF项目实战(经典) WPF 如何修改button圆角(经典) WPF XAML 为项目设置全局样式

    3.2K20

    如何让 WPF 程序更好地适配 UI 自动化

    虽说 WPF 支持不错,但我还是有几点需要说明一下: 这里我说的是“UI 自动化”,不是“UI 自动化测试”;前者比后者范围更广泛,因为前者除了能用来做 UI 自动化测试之外,还能同时应用于读屏软件,...CheckBox 检查框 combobox ComboBox 组合框 custom UserControl 自定义控件 datagrid DataGrid 数据表 dataitem DataItem...然而,实际情况却并不是这样…… 哪些情况会破坏 WPF 的 UI 自动化 很多时候,我们在写代码时,可能太过于关注最终做成了什么样子,忽略了控件原本的层次结构和属性含义,这就可能导致我们的程序暴露给...尽量保留 WPF 自带的 UI 自动化机制,避免对样式和模板做过于复杂的定制,如果要做,则尽可能使用现成常用的属性,不是自己定义新属性(例如用好 Content 不是定义一个新的 TitleText...// 你可以考虑返回你某个自定义属性的或某些自定义属性组合的,而这个最能向用户反映此控件当前的状态。

    45120

    C# WPF MVVM模式Caliburn.Micro框架下事件发布与订阅

    01 前言 处理同模块不同窗体之间的通信和不同模块之间不同窗体的通信,Caliburn提供了一种事件机制,可以在应用程序中低耦合的模块之间进行通信,该机制基于事件聚合器服务,允许发布者和订阅者之间通过事件进行通讯...WPF MVVM项目实战(进阶①) C# WPF MVVM项目实战(进阶②) C# WPF框架Caliburn.Micro快速搭建 C# WPF项目实战 C# WPF mvvm模式下combobox绑定...(list、Dictionary) C# WPF MVVM模式下在主窗体显示子窗体并获取结果 C# WPF Caliburn.Micro框架下利用Mef加载其它项目界面...C# WPF文本框TextEdit不以科学计数法显示 C# 通过正则表达式来限制控件输入有效性 C# datagridview、datagrid、GridControl增加行号 C# =>符号的使用...C# 无意间写了一段线程死锁的代码 C# 看懂这100+代码,你就真正入门了(经典) C# WPF项目实战(经典) WPF 如何修改button圆角(经典) WPF XAML 为项目设置全局样式

    1.9K10

    【愚公系列】2023年11月 WPF控件专题 GridView控件详解

    WPF控件可以分为两类:原生控件和自定义控件。原生控件是由Microsoft提供的内置控件,如Button、TextBox、Label、ComboBox等。这些控件都是WPF中常见的标准用户界面元素。...自定义控件可以根据需求提供更多的功能和自定义化选项,以及更好的用户体验。一、GridView控件详解WPF中的GridView控件是用于展示数据的一种列表控件。...GridView控件可以在列之间进行排序、过滤和分组,可以使用不同的视图模式来呈现数据,包括传统的表格视图和磁贴式视图。...GridView控件与其他WPF控件配合使用可以实现更高级的功能,例如与TreeView控件配合使用实现分层数据呈现,与DataGrid控件配合使用实现可编辑数据表格呈现等等。...CanUserResizeColumns:一个布尔,表示用户是否可以通过拖动列边缘来调整列的宽度。

    62711

    Newbeecoder.UI新版开源控件库DataGrid使用说明

    DataGrid控件显示数据和信息的集合。在WPF能自定义外观,单元格,表格头部,字体,颜色等内容。 使用ItemsSource属性进行数据源绑定,绑定任何实现IEnuemerable的数据源。...GridLinesVisibility使网格线可见、AreRowDetailsFrozen冻结详细信息。Microsoft Docs对DataGrid每项功能有详细说明。...在样式中有常见的表格选项,如交替背景和显示/隐藏标题,网格线和滚动条。多个样式和模板属性,通过对ColumnHeaderStyle,CellStyle,RowStyle自定义样式达到设计需求。...Newbeecoder.UI是一个轻量级和扩展性的开源项目,基于MVVM开发框架,可用来快速搭建WPF应用程序,而无需了解控件内部实现细节,方便扩展更多控件样式以及使用,该项目使用纯C#+WPF开发,易于扩展和集成到开发项目中...Demo下载: Newbeecoder.UI.zip Newbeecoder.UI控件库根据用户需求开发稳定高效项目,通过视频来演示控件库整体功能: 视频内容 ​ 在控件库中使用DataGrid很简单

    2.9K30

    【愚公系列】2023年09月 WPF控件专题 ComboBox控件详解

    这些控件都是WPF中常见的标准用户界面元素。 自定义控件则允许开发人员使用XAML和C#等编程语言来创建个性化的用户界面元素。自定义控件可以根据需求提供更多的功能和自定义化选项,以及更好的用户体验。...一、ComboBox 控件详解 WPF中的ComboBox控件是一种用户界面元素,允许用户从一个下拉列表中选择一个选项。...显示成员和成员:可以使用DisplayMemberPath属性指定ComboBox控件中要显示的文本属性,ValueMemberPath属性指定ComboBox控件中的属性。...默认情况下,ComboBox控件会将显示成员和成员设置为相同的属性。 添加选项:可以使用Items集合添加选项ComboBox控件中。可以添加字符串、对象或数据绑定表达式。...下拉式菜单:适用于菜单项较多的场景,可以通过ComboBox来展示整个菜单,并进行多级选择。 ComboBox控件是一种非常灵活的控件,可以用于许多不同的场景中,为用户提供更好的交互体验。

    1K20

    WPF 属性变动后的业务处理及恢复原始的方法

    WPF 属性变动后的业务处理及恢复原始的方法独立观察员 2023 年 2 月 26 日一、前言本文主要介绍在 WPF 中,当属性变动后,如何依据是哪个属性变动了,以及其变动的的情况来进行相应业务处理的推荐的方式...这种方式更加灵活,因为可以根据情况来随时附加和取消处理方法。...属性变动后的业务处理及恢复原始的方法 [http://dlgcy.com/wpf-after-propertychanged-and-restore-original-value/]WPF我向 ChatGPT...WPF 元素导出为图片的方法让 WPF 的 RadioButton 支持再次点击取消选中的功能WPF DataGrid 如何将被选中行带到视野中WPF 触屏事件后触发鼠标事件的问题及 DataGrid...误触问题WPF DataGrid 通过自定义表头模拟首固定WPF ComboBox 使用 ResourceBinding 动态绑定资源键并支持语言切换【翻译】WPF 中附加行为的介绍 Introduction

    3.4K50

    WPF 下拉框选项做鼠标 Hover 预览效果

    本文来告诉大家如何在 WPF 中,在 下拉框 ComboBox 里面,鼠标移动到 ComboBoxItem 上时,自动触发对应的事件,用来预览此选项。...例如我在实现一个颜色下拉框,此时我可以通过点击下拉框显示多个不同的颜色,鼠标移动到某个颜色选项上,可以修改界面,预览此颜色的内容 大概的界面如下图,点击右边的颜色下拉框,可以显示多个不同的颜色,鼠标移动到下拉框的选项上...="{Binding Color}"> 接着在后台代码添加 ComboBox_OnMouseMove 方法,在 ComboBox_OnMouseMove 方法里面判断当前的鼠标移动,根据当前鼠标移动所在的项对应的 DataContext...lindexi_gd.git 获取代码之后,进入 QicafejukarJaifairnemleree 文件夹 本文会经常更新,请阅读原文: https://blog.lindexi.com/post/WPF

    1.9K20

    实现销售合同结存条件

    首先在前端写如下代码,jsp页面的搜索条件里面写个select下拉框,里面有四个option标签,还有value, select下拉框设置默认只需要在需要设置成默认的地方加个selected 结存条件...").combobox("getText"); /* 根据客户单位名称查询 */ queryParameter.customerId = $("#searchCustomerId").combobox...("getValue"); /* 根据客户类别查询 */ queryParameter.customerCategory = $("#searchCustomerCategory").combobox...("getText"); /* 根据结存条件查询 */ queryParameter.jcMoney = $("#jcMoney").combobox("getValue"); /* 根据签订时间查询...rows = $('#dg').datagrid('getRows') //获取当前的数据 var ptotal = 0 //计算采购开票金额的总和 var invo = 0 //计算采购已收合同金额的总和

    96040

    WPF面试题大全,秒杀面试官必备

    依赖属性与以前属性的不同之处: 与以前的属性相比,依赖属性具有以下不同之处: • 的存储方式:依赖属性的不是直接存储在对象的字段或属性中,而是由WPF框架负责管理。...• 继承和优先级:依赖属性支持的继承和优先级,使得属性的可以从父元素传递给子元素,并根据不同的优先级进行覆盖。..."的DataGrid控件,并自动根据数据源生成列。...这将使DataGrid显示查询结果中的数据。 运行应用程序,DataGrid控件将显示来自SQL数据库表的数据。 以上代码仅供参考,根据项目的实际情况来调整。 13、解释完整的WPF对象层次结构 ?...结语 本文收集了WPF的面试题,及每个问题参考答案,希望对你的面试准备有所帮助。由于面试场景和问题方向不同,大家可以根据不同情况酌情回答,答案仅供参考,如有错误或者更好的答案欢迎留言。

    73910

    OEA 中 WPF 树型表格虚拟化设计方案

    表格的虚拟化     由前面的内容可以看出,如果要在 WPF 中实现一个行列都支持虚拟化的 UIVPanel,只需要从 VirtualizingPanel 上继承下一个 UIVPanel 类型,并根据列的宽度来计算并生成相应的单元格就行了...还好,WPF 自带的 DataGrid 也带有行列虚拟化的功能,我们可以先看一下 DataGrid 是如何实现的。 下图是 DataGrid 打开行、列虚拟化功能后生成的可视树: ?    ...TreeGrid 的虚拟化     根据之前的分析,我们已经知道表格 DataGrid 实现虚拟化都需要哪些元素,元素之间是如何交互的。...VirtualizingStackPanel 为了提高性能,它是根据 Item (项数)不是 Pixel (象素)来计算滚动条信息。...表格 TreeGridRow 类则继承自 HeaderedItemsControl 类型,它的总行高应该是本行的高度加上所有子的高度,也不是一个定,所以现在虚拟化功能也被关闭。

    2.7K70
    领券