关于使用MVVM模式在WPF的DataGrid控件中实现ComboBox编辑列
最近在做一个组态软件的项目,有一个需求需要在建立IO设备变量的时候选择变量的类型等。
建立IO变量的界面是一个DataGrid实现的,可以一行一行的新建变量,如下如所示:
这里需要使用带有ComboBox控件的列,如何实现呢?
我首先想到的是使用DataGridComboBoxColumn来实现,可是在绑定数据的时候出现了问题,数据怎么也绑定不上。后来经过多方查证,发现原来DataGridComboBoxColumn对数据源有限制,只能是一下3中情况之一:
1、静态资源。
2、x:静态代码实体。
3、ComboBoxItem类型的内联集合。
基于扩展性、代码规范等情况考虑,这三种方案都被否决了。
然后就想到使用DataGridTemplateColumn来实现。
xaml代码:
<DataGrid ItemsSource="{Binding Model.IoVariables}"
AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTemplateColumn Header="类型">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding VariableType}"></TextBlock>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox SelectedItem="{Binding VariableType}" ItemsSource="{Binding DataContext.Model.VariableTypes,RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid}}"></ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="变量名" Binding="{Binding VariableName}"></DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
这里需要注意的一点是ComboBox的ItemsSource的绑定方式,在《关于WPF中ItemsControl系列控件中Item不能继承父级的DataContext的解决办法》一文中解释了这种绑定方式。
ViewModel代码:
using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Command;
using WpfApplication1.Models; namespace WpfApplication1.ViewModels
{
public class IOVariableViewModel : ViewModelBase
{
public IOVariableModel Model { get; set; } public IOVariableViewModel()
{
Model = new IOVariableModel(); Model.TestCommand = new RelayCommand(TestCommandHandler); Model.VariableTypes.Add("整型");
Model.VariableTypes.Add("实型");
Model.VariableTypes.Add("字符串");
}
}
Model代码
using System.Collections.ObjectModel;
using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Command; namespace WpfApplication1.Models
{
public class IOVariableModel : ViewModelBase
{
private ObservableCollection<IOVariable> _ioVariables; public ObservableCollection<IOVariable> IoVariables
{
get
{
return _ioVariables;
}
set
{
_ioVariables = value;
RaisePropertyChanged(() => IoVariables);
}
} private ObservableCollection<string> _variableTypes; public ObservableCollection<string> VariableTypes
{
get
{
return _variableTypes;
}
set
{
_variableTypes = value;
RaisePropertyChanged(() => VariableTypes);
}
} public RelayCommand TestCommand { get; set; } public IOVariableModel()
{
VariableTypes = new ObservableCollection<string>();
IoVariables = new ObservableCollection<IOVariable>();
}
}
}
IOVariable.cs的代码
namespace WpfApplication1.Models
{
public class IOVariable
{
public string VariableType
{
get;
set;
} public string VariableName
{
get;
set;
}
}
}
关于本文的源码:点击下载
关于使用MVVM模式在WPF的DataGrid控件中实现ComboBox编辑列的更多相关文章
- 获取WPF的DataGrid控件中,是否存在没有通过错误验证的Cell
/// <summary> /// 获取DataGrid的所有行是否存在验证错误. /// </summary> /// &l ...
- WPF 4 DataGrid 控件(基本功能篇)
原文:WPF 4 DataGrid 控件(基本功能篇) 提到DataGrid 不管是网页还是应用程序开发都会频繁使用.通过它我们可以灵活的在行与列间显示各种数据.本篇将详细介绍WPF 4 中 ...
- WPF的DataGrid控件从excel里复制数据然后粘贴
WPF的DataGrid控件不能像winform的DataGridView控件一样,支持值的粘贴.WPF的DataGrid控件本质上是跟数据绑定联系在一起,所以需要进行复制粘贴的操作,可以在wpf里用 ...
- WPF 4 DataGrid 控件(进阶篇一)
原文:WPF 4 DataGrid 控件(进阶篇一) 上一篇<WPF 4 DataGrid 控件(自定义样式篇)>中,我们掌握了DataGrid 列表头.行表头.行.单元格相关的 ...
- WPF 4 DataGrid 控件(进阶篇二)
原文:WPF 4 DataGrid 控件(进阶篇二) 上一篇<WPF 4 DataGrid 控件(进阶篇一)>中我们通过DataGridTemplateColumn 类自定义编辑 ...
- WPF 4 DataGrid 控件(自定义样式篇)
原文:WPF 4 DataGrid 控件(自定义样式篇) 在<WPF 4 DataGrid 控件(基本功能篇)>中我们已经学习了DataGrid 的基本功能及使用方法.本篇将继续 ...
- 在WPF的WebBrowser控件中抑制脚本错误
原文:在WPF的WebBrowser控件中抑制脚本错误 今天用WPF的WebBrowser控件的时候,发现其竟然没有ScriptErrorsSuppressed属性,导致其到处乱弹脚本错误的对话框,在 ...
- WPF 自定义DataGrid控件样式
内容转自https://www.cnblogs.com/xiaogangqq123/archive/2012/05/07/2487166.html 一.DataGrid基本样式(一) 小刚已经把Dat ...
- WPF DataGrid控件中某一列根据另一个文本列的值显示相应的模板控件
之前做项目的时候需要实现这样一个功能.WPF DataGrid有两列,一列为"更新状态”列,一列为"值"列,如果"更新状态"列的值为“固定值更新”,则 ...
随机推荐
- 设置type为file的input标签选择图片类型
设置能选择各种类型的图片如:png,jpg <input id="file" name="file" type="file" acce ...
- SpringMVC解析1-使用示例
Spring MVC分离了控制器.模型对象.分派器以及处理程序对象的角色,这种分离让它们更容易进行定制.Spring的MVC是基于servlet功能实现的,通过实现Servlet接口的Dispatch ...
- 分享Kali Linux 2016.2第49周虚拟机
分享Kali Linux 2016.2第49周虚拟机该虚拟机使用Kali Linux 2016.2第49周的64位镜像安装而成.基本配置如下:(1)该系统默认设置单CPU双核,内存为2GB,硬盘为50 ...
- css3 -- 多列
1.指定分列: E{column-count:2:} --- 两列 E{ -moz-column-count:2: -webkit-column-count:2: } Firefox与webkit实现 ...
- Oracle PL/SQL设置快捷键的方法
pl sql默认设置不是很方便,最近搜罗了一下网上关于PLSQL的一些常用快捷键配置,主要是方便以后自个使用 1.登录后默认自动选中My Objects 默认情况下,PLSQL Developer ...
- scau 8637 阶乘与因子 筛素数
时间限制:500MS 内存限制:1000K提交次数:189 通过次数:46 题型: 编程题 语言: G++;GCC Description 游戏玩了很久总会厌的,连Lyd的蚂蚁都被放生了.... ...
- Set集合对象比较两个元素的方法
Set集合对象比较两个元素的方法并不是根据“equals()”方法的返回值来比较.而是用“hashCode()”方法来进行判断.只要两个元素的“hashCode()”方法的返回值相同,就认为两个元素相 ...
- hdu 2160 母猪的故事
Problem Description 话说现在猪肉价格这么贵,著名的ACBoy 0068 也开始了养猪生活.说来也奇怪,他养的猪一出生第二天开始就能每天中午生一只小猪,而且生下来的竟然都是母猪.不过 ...
- 51Nod 1002 数字三角形 Label:水水水 && 非学习区警告
一个高度为N的由正整数组成的三角形,从上走到下,求经过的数字和的最大值. 每次只能走到下一层相邻的数上,例如从第3层的6向下走,只能走到第4层的2或9上. 5 8 4 3 6 9 7 ...
- LVS + KEEPAlived 配置 DIR模式
1 .1 Lvs LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统.本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目 ...