问题】

在最近的项目中使用DataGrid的DataGridCheckBoxColumn绑定了后台TagModel类的IsSelected字段,数据源是TagModel类型的Dictionary,运行发现Checkbox不能正常勾选,提示错误:此视图不允许“EditItem”。

【问题重现】

前台:

<DataGridCheckBoxColumn Binding="{Binding IsSelected}" />

后台:

Dictionary<string, TagModel> dicTag = new Dictionary<string, TagModel>();
TagModel tm = new TagModel ();
dicTag.Add("Test",tm);
dgTest.ItemsSource = dicTag.Values;

TagModel.cs:

private bool isSelected = false;
public bool IsSelected
{
get
{
return isSelected;
} set
{
isSelected = value;
}
}

运行后点击CheckBox就会弹出错误:此视图不允许“EditItem”。

【问题分析】

1.修改前台代码为:

<DataGridTemplateColumn>                                
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding IsSelected}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

测试无问题。

2.不修改前台代码,修改后台代码为

Dictionary<string, TagModel> dicTag = new Dictionary<string, TagModel>();
TagModel tm = new TagModel ();
dicTag.Add("Test",tm);
List<TagModel> lstTM = new List<TagModel>(dicTag.Values);
dgTest.ItemsSource = lstTM ;

测试也无问题。

分析:1.使用Dictionary的Values作为数据源时,DataGridTemplateColumn可以正常操作而DataGridCheckBoxColumn会报错,猜测这两种Column采用了不同的处理机制。

2.使用List复制Dictionary的Values作为数据源时,DataGridTemplateColumn和DataGridCheckBoxColumn都能正常操作,由于Dictionary的Values没有继承IList接口而List继承了该接口,猜测在使用没有继承IList的变量作为数据源时DataGridCheckBoxColumn和DataGridTemplateColumn的处理机制不同。

【问题解决】

通过MSDN版主Lisa Zhu的解释,最终弄明白问题所在http://social.msdn.microsoft.com/Forums/zh-CN/wpfzhchs/thread/cd25f422-dabc-4d1c-a401-16f9b41c1dfd

  • CellTemplateCellEditingTemplate 两种情况,即:单元格不可编辑模式和单元格可编辑模式。
  • DataGridCheckBoxColumnCellEditingTemplate继承而来。
  • 对cell进行编辑时,DataGrid的ItemSource 需要一个继承了IList<T>接口的集合,而Dictionary.Values 没有继承该接口,所以会报错。
  • 这也就是为什么使用DataGridCheckBoxColumn会报错而使用CellTemplate不会报错的原因。
  • 当使用List作为数据源,由于List已经继承IList接口,所以DataGridCheckBoxColumnCellEditingTemplate都能够正常使用。

【总结】

使用Dictionary的Values作为数据源时需要将Dictionary的Values先复制到List中,再将List作为数据源绑定。

【P.S】

如果使用Dictionary的Values作为数据源并使用CellEditingTemplate 绑定,可以将该列的IsReadOnly设为True,则始终不会使用CellEditingTemplate属性值,就不会抛出错误。但同时也不能操作这一列了。

<script type="text/javascript"><!-- google_ad_client = "ca-pub-1944176156128447"; /* cnblogs 首页横幅 */ google_ad_slot = "5419468456"; google_ad_width = 728; google_ad_height = 90; //--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>

DataGrid绑定Dictionary问题的更多相关文章

  1. VS2010 MFC DataGrid绑定实例

    VS2010环境下MFC使用DataGrid绑定数据源 参考:http://blog.csdn.net/fddqfddq/article/details/7874706 详细介绍如何在MFC中使用Da ...

  2. WPF DataGrid 绑定DataSet数据 自动生成行号

    1.绑定数据:dataGrid1.ItemsSource = dataSet.Tables[0].DefaultView; 注意:在创建DataGrid 时可以通过AutoGenerateColumn ...

  3. ComboBox绑定Dictionary做为数据源

    http://www.cnblogs.com/refresh/archive/2012/07/14/2591503.html https://msdn.microsoft.com/zh-cn/libr ...

  4. WPF DataGrid绑定一个组合列

    WPF DataGrid绑定一个组合列 前台: <Page.Resources>        <local:InfoConverter x:Key="converter& ...

  5. WPF DataGrid 绑定行双击行命令

    WPF DataGrid 绑定行双击行命令 <DataGrid ...> <DataGrid.InputBindings> <MouseBinding MouseActi ...

  6. 下拉列表框DropDownList绑定Dictionary泛型类

    DropDownList绑定Dictionary泛型类 定义一个Dictionary泛型类 /// <summary>    /// 产品类型    /// </summary> ...

  7. easyUI之datagrid绑定后端返回数据的两种方式

    先来看一下某一位大佬留下的easyUI的API对datagrid绑定数据的两种方式的介绍. 虽然精简,但是,很具有“师傅领进门,修行靠个人”的精神,先发自内心的赞一个. 但是,很多人和小编一样,第一次 ...

  8. WPF DataGrid 绑定数据及时更新的处理

    原文:WPF DataGrid 绑定数据及时更新的处理 默认情况下datagrid 绑定数据源后,在界面编辑某一列后,数据不会及时更新到内存对象中.如在同一行上有一个命令对来获取 当前选中行(内存对象 ...

  9. wpf中datagrid绑定数据源发生改变

    1.若datagrid绑定的数据源是同一个的话,即使里面的数据不同.页面也不会刷新,则需要重置数据源,再绑定.处理如下: datagrid1.ItemsSource=ListModule; 若List ...

随机推荐

  1. hdu 1005(找循环节)

    Number Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  2. js坑 把数字型的字符串默认为数字 把前面的0给去掉了("001")

    <script> b("); function b(id) { console.log("b函数的id:"+id); //var history = &quo ...

  3. PC网页js调用本地应用程序

    最近要现实一个在PC网页中实现点击按钮调用本地应用程序的功能 其实实现原理也非常简单, 首先注册一个本地注册表文件,指向本地应用程序路径 其次在网页中用js指向这个注册表文件,就可以实现网页调用本地应 ...

  4. POJ 2057 The Lost House [树状DP]

    题意:一只蜗牛将壳忘在了一棵树的某一个末结点(叶子)上.它想找回自己的壳,但忘记是丢在哪个结点上了,只好从树根开始网上爬,一个结点一个结点地找.在一些结点上居住着毛毛虫,它们会告诉蜗牛该结点以及它的子 ...

  5. #译# Core Data概述 (转)

    昨晚熬夜看发布会(本以为屌丝终于能买得起苹果了,谁知道...),因为看不了视频直播,所以就正好有空就把www.objc.io最新的一篇文章翻译了一下,同时感谢CocoaChina翻译组提供校对,以下为 ...

  6. 在红米note4上实现自动安装软件

    因为要做自动化测试,需要对已发布的包进行回归手测,这个时候需要手动安装APK,但是红米会弹出继续安装的按钮,手点一次比较烦,想自动点"继续安装"按钮! 感谢先行者们的分享 本文参考 ...

  7. XCode设置竖屏

    选中你的项目,在General这个标签内,Deoployment info的这个分组,有一个Device Orientation 标签,内有一个Portrait的选项,选中是竖屏,取消选中是横屏

  8. MFC中 CString类型用fprintf 函数写到文件中乱码的解决办法

    在上一篇中记录了用fprintf函数写内容到文件中的方法,但是发现了问题:产生的文件字符串有乱码现象. 解决办法:用_ftprintf函数 另外,据说: unicode的话要用fwprintf    ...

  9. 社区管理有捷径!Wish3D Earth社区网格化管理案例重磅上线

    社区网格化是精细化.全覆盖.高效率的社区管理模式,便捷有效的社区网格化管理平台是社区网格化管理的关键. Wish3D Earth全新上线三维社区网格化管理平台,使用实景三维模型作为地图,地形地貌真实展 ...

  10. NormalMap 贴图 [转]

    转载: http://www.zwqxin.com/archives/shaderglsl/review-normal-map-bump-map.html   说起Normal Map(法线贴图),就 ...