最近在做一个组态软件的项目,有一个需求需要在建立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编辑列的更多相关文章

  1. 获取WPF的DataGrid控件中,是否存在没有通过错误验证的Cell

     /// <summary>         /// 获取DataGrid的所有行是否存在验证错误.         /// </summary>         /// &l ...

  2. WPF 4 DataGrid 控件(基本功能篇)

    原文:WPF 4 DataGrid 控件(基本功能篇)      提到DataGrid 不管是网页还是应用程序开发都会频繁使用.通过它我们可以灵活的在行与列间显示各种数据.本篇将详细介绍WPF 4 中 ...

  3. WPF的DataGrid控件从excel里复制数据然后粘贴

    WPF的DataGrid控件不能像winform的DataGridView控件一样,支持值的粘贴.WPF的DataGrid控件本质上是跟数据绑定联系在一起,所以需要进行复制粘贴的操作,可以在wpf里用 ...

  4. WPF 4 DataGrid 控件(进阶篇一)

    原文:WPF 4 DataGrid 控件(进阶篇一)      上一篇<WPF 4 DataGrid 控件(自定义样式篇)>中,我们掌握了DataGrid 列表头.行表头.行.单元格相关的 ...

  5. WPF 4 DataGrid 控件(进阶篇二)

    原文:WPF 4 DataGrid 控件(进阶篇二)      上一篇<WPF 4 DataGrid 控件(进阶篇一)>中我们通过DataGridTemplateColumn 类自定义编辑 ...

  6. WPF 4 DataGrid 控件(自定义样式篇)

    原文:WPF 4 DataGrid 控件(自定义样式篇)      在<WPF 4 DataGrid 控件(基本功能篇)>中我们已经学习了DataGrid 的基本功能及使用方法.本篇将继续 ...

  7. 在WPF的WebBrowser控件中抑制脚本错误

    原文:在WPF的WebBrowser控件中抑制脚本错误 今天用WPF的WebBrowser控件的时候,发现其竟然没有ScriptErrorsSuppressed属性,导致其到处乱弹脚本错误的对话框,在 ...

  8. WPF 自定义DataGrid控件样式

    内容转自https://www.cnblogs.com/xiaogangqq123/archive/2012/05/07/2487166.html 一.DataGrid基本样式(一) 小刚已经把Dat ...

  9. WPF DataGrid控件中某一列根据另一个文本列的值显示相应的模板控件

    之前做项目的时候需要实现这样一个功能.WPF DataGrid有两列,一列为"更新状态”列,一列为"值"列,如果"更新状态"列的值为“固定值更新”,则 ...

随机推荐

  1. XSS 跨站脚本攻击之构造剖析(一)

    1.XSS-Filter:跨站脚本过滤器,用于分析用户提交的输入,并消除潜在的跨站脚本攻击 (1)XSS Filter实际上是一段精心编写的过滤函数作用是过滤XSS跨站脚本代码: (2)绕过XSS F ...

  2. Delphi 包的设计思想及它与PAS、BPL、DCU、DLL、OXC的关系。

    DCP ,BPL分别是什么文件,起什么作用?你在DELPHI中建立一个package然后保存一下,看看. bpl和Dll比较相似.只是BPL是BORLAND自己弄出来的东西!!!调用也和调用DLL相似 ...

  3. topcoder SRM 617 DIV2 SlimeXSlimonadeTycoon

    此题需要注意的两个地方是 (1)在某天生产出来的Slimonades,必须在stale_limit天内必须卖完,否则超过stale_limit内抛弃(东西都有保质期) (2)每天生产出来的Slimon ...

  4. ACM 田忌赛马

    田忌赛马 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 Here is a famous story in Chinese history. "That ...

  5. POJ - Ubiquitous Religions

    Description 当今世界有很多不同的宗教,很难通晓他们.你有兴趣找出在你的大学里有多少种不同的宗教信仰. 你知道在你的大学里有n个学生(0 < n <= 50000) .你无法询问 ...

  6. NOI 题库 2753

    2753  走迷宫 描述 一个迷宫由R行C列格子组成,有的格子里有障碍物,不能走:有的格子是空地,可以走.给定一个迷宫,求从左上角走到右下角最少需要走多少步(数据保证一定能走到).只能在水平方向或垂直 ...

  7. POJ 1244 Slots of Fun(计算几何)

    题目链接 很简单的一题,数据 很小,直接暴力的.但是也是写也好久,有几个数,没算好...一次CE,一次PE,3Y. #include <iostream> #include <cst ...

  8. Java_JAVA6动态编译的问题

    摘自:http://www.iteye.com/problems/14909 在使用JAVA6动态编译时遇到的一个问题,动态编译方法已经写就.通过main方法调用的动态编译时,编译通过,并可以使用编译 ...

  9. posix and system V IPC

    轉載自 http://www1.huachu.com.cn/read/readbook.asp?bookid=10104131 http://www1.huachu.com.cn/read/readb ...

  10. 常见的sql语句 注意点及用法【区分mysql 和Sqlserver】

    如何判断在字符串字段中是否包含某个字符串 mysql:   url:http://www.springload.cn/springload/detail/399 mysql> SELECT * ...