WPF使用DataGridComboBoxColumn完成绑定
在使用DataGrid的时候,有时候需要使某些列为ComboBox,这时自然想到使用DataGridComboBoxColumn,但是如果使用的是ItemsSource数据绑定后台的对象,就会发现,这根本就不能用。
首先,看有问题的代码:
后台代码:
- using System.Windows;
- using System.Collections.ObjectModel;
- using System.ComponentModel;
- namespace WPFTest
- {
- /// <summary>
- /// 数据项
- /// </summary>
- public class DataItem
- {
- public int Value { get; set; }
- public DataItem(int val) { Value = val; }
- }
- /// <summary>
- /// MainWindow.xaml 的交互逻辑
- /// </summary>
- public partial class MainWindow : Window
- {
- public MainWindow()
- {
- InitializeComponent();
- // 选中数据
- SelectedList.Add(new DataItem()); SelectedList.Add(new DataItem());
- // 可选数据
- SelectionList.Add(); SelectionList.Add(); SelectionList.Add();
- }
- /// <summary>
- /// 选中的数据列表
- /// </summary>
- public ObservableCollection<DataItem> SelectedList
- {
- get { return _selectedList; }
- set { _selectedList = value; }
- }
- private ObservableCollection<DataItem> _selectedList = new ObservableCollection<DataItem>();
- /// <summary>
- /// 可供选择的数据列表
- /// </summary>
- public ObservableCollection<int> SelectionList
- {
- get { return _selectionList; }
- set { _selectionList = value; }
- }
- private ObservableCollection<int> _selectionList = new ObservableCollection<int>();
- // 显示选中的
- private void Button_Click(object sender, RoutedEventArgs e)
- {
- TBX_Selected.Text = "";
- foreach (var item in SelectedList)
- TBX_Selected.Text += item.Value.ToString(" --->0<--- ");
- }
- }
- }
前台为:
- <Window x:Class="WPFTest.MainWindow"
- xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- Title="WPFTest" Name="this" Height="" Width="">
- <StackPanel>
- <DataGrid ItemsSource="{Binding Path=SelectedList,ElementName=this}" AutoGenerateColumns="False">
- <DataGrid.Columns>
- <DataGridTextColumn Header="文本模式" Binding="{Binding Path=Value}" />
- <DataGridComboBoxColumn Header="ComboBox模式"
- SelectedValueBinding="{Binding Path=Value}"
- ItemsSource="{Binding Path=SelectionList,ElementName=this}" />
- </DataGrid.Columns>
- </DataGrid>
- <Button Content="观察选中的数据" Click="Button_Click" Margin=""/>
- <TextBox Name="TBX_Selected" />
- </StackPanel>
- </Window>
在这里通过把Window控件的Name设置为this,然后在绑定的时候指定ElementName=this及Path属性来关联到后台数据源。为了测试是否有效,我还定义了一个TextBox来显示SelectedList中的数据的值。首先,可以肯定的是,用DataGridTextColumn一点问题也没有,数据可以正常地显示和更新,但是使用DataGridComboBoxColumn时问题就出现了,数据不能显示,就像什么都没有绑定上去一样:
我在网上找了下资料,都与MSDN上的例子相似,DataGridComboBoxColumn对数据源有下面的要求:
使用下列选项之一,若要填充下拉列表,首先设置 ComboBox 的 ItemsSource 属性:
1、静态资源。有关更多信息,请参见 StaticResource 标记扩展。
2、x: 静态代码实体。有关更多信息,请参见 x:Static 标记扩展。
3、ComboBoxItem 类型的内联集合。
于是,试试DataGridTemplateColumn来做ComboBox:
- <DataGridTemplateColumn Header="Template模式">
- <DataGridTemplateColumn.CellTemplate>
- <DataTemplate>
- <ComboBox SelectedValue="{Binding Path=Value}" ItemsSource="{Binding Path=SelectionList,ElementName=this}" />
- </DataTemplate>
- </DataGridTemplateColumn.CellTemplate>
- </DataGridTemplateColumn>
运行发现,显示是正常了,但是不论我怎么改,SelectedList中的数据都不带改变,我尝试设置了ComboBox的各项属性,也没有成功。但是非常奇怪的地方是,如果在选择后,去点了上面的DataGridComboBoxColumn ,数据就能正常正同步过去:
我想这可能是DataGridComboBoxColumn在选择后会触发一个事件,完成同步工作。
好了,这样还是不行,我去了stackoverflow上找资料,问题终于得到了解决。基本上原因是这样的:DataGrid的列并没有数据上下文,所以DataGridTemplateColumn中的ComoBox从未添加到“Visual Tree(可视化树)”中。只要Grid绘制了单元,并且得到了数据上下文后,就能正常地使用ItemsSource属性来完成绑定了。修正后的代码:
- <DataGridComboBoxColumn Header="ComboBox模式(修正)">
- <DataGridComboBoxColumn.EditingElementStyle>
- <Style TargetType="ComboBox">
- <Setter Property="ItemsSource" Value="{Binding Path=SelectionList,ElementName=this}" />
- <Setter Property="SelectedValue" Value="{Binding Path=Value}" />
- </Style>
- </DataGridComboBoxColumn.EditingElementStyle>
- </DataGridComboBoxColumn>
这样,数据能够正常地同步了,但是如果不点中对应单元格,ComboBox就不会显示出来,只有点中了才显示,继续参考资料,问题原因是上面只设置了EditingElementStyle(编辑时样式),所以在选中编辑时就会出现ComboBox,要想一直显示,还得设置ElementStyle,使它和EditingElementStyle一样就行了:
- <DataGridComboBoxColumn.ElementStyle>
- <Style TargetType="ComboBox">
- <Setter Property="ItemsSource" Value="{Binding Path=SelectionList,ElementName=this}" />
- <Setter Property="SelectedValue" Value="{Binding Path=Value}" />
- </Style>
- </DataGridComboBoxColumn.ElementStyle>
问题圆满解决,其实也不难,只是不知道,没想到而已,大家可以看看。
转载请注明原址:http://www.cnblogs.com/lekko/archive/2012/11/23/2784789.html
WPF使用DataGridComboBoxColumn完成绑定的更多相关文章
- WPF窗体视图中绑定Resources文件中字符串时,抛出:System.Windows.Markup.StaticExtension
问题描述: 在Resources.resx定义了一个静态字符串字段Title,并在WPF窗体视图中绑定为窗体的标题: Title="{x:Static local:Resources.Tit ...
- WPF 在事件中绑定命令(不可以在模版中绑定命令)
其实这也不属于MVVMLight系列中的东东了,没兴趣的朋友可以跳过这篇文章,本文主要介绍如何在WPF中实现将命令绑定到事件中. 上一篇中我们介绍了MVVMLight中的命令的用法,那么仅仅知道命令是 ...
- WPF PasswordBox不支持绑定解决方法
原文:WPF PasswordBox不支持绑定解决方法 PasswordBox的Password属性因为安全原因不支持直接绑定,可以使用依赖属性实现.直接插入代码 public class Passw ...
- [WPF 基础知识系列] —— 绑定中的数据校验Vaildation
前言: 只要是有表单存在,那么就有可能有对数据的校验需求.如:判断是否为整数.判断电子邮件格式等等. WPF采用一种全新的方式 - Binding,来实现前台显示与后台数据进行交互,当然数据校验方式也 ...
- WPF自定义控件的自定义属性绑定后不更新问题
原文:WPF自定义控件的自定义属性绑定后不更新问题 需要在绑定时设置属性变更触发 UpdateSourceTrigger=PropertyChanged 例如: <Border CornerRa ...
- WPF 在事件中绑定命令
导航:MVVMLight系列文章目录:<关于 MVVMLight 设计模式系列> 其实这也不属于MVVMLight系列中的东东了,没兴趣的朋友可以跳过这篇文章,本文主要介绍如何在WPF中实 ...
- WPF中,如何将绑定源设置到单件实例
原文:WPF中,如何将绑定源设置到单件实例 WPF中,如何将绑定源设置到单件实例 周银辉 大概两个月前,曾有位朋友问我:如 ...
- WPF——TargetNullValue(如何在绑定空值显示默认字符)
原文:WPF--TargetNullValue(如何在绑定空值显示默认字符) 说明:在数据绑定时,如果有些字段为空值,那么在数据绑定时可以用默认值来显示为空的字段. </Grid> { L ...
- 整理:WPF中Xaml中绑定枚举的写法
原文:整理:WPF中Xaml中绑定枚举的写法 目的:在Combobox.ListBox中直接绑定枚举对象的方式,比如:直接绑定字体类型.所有颜色等枚举类型非常方便 一.首先用ObjectDataPro ...
随机推荐
- ElasticSearch 2 (35) - 信息聚合系列之近似聚合
ElasticSearch 2 (35) - 信息聚合系列之近似聚合 摘要 如果所有的数据都在一台机器上,那么生活会容易许多,CS201 课商教的经典算法就足够应付这些问题.但如果所有的数据都在一台机 ...
- “耐撕”团队 2016.03.25 站立会议
1.时间:2016.3.23 2.成员: Z 郑蕊 * 组长 (博客:http://www.cnblogs.com/zhengrui0452/), P 濮成林(博客:http://www.cnblo ...
- array_pop()方法
array_pop — 将数组最后一个单元弹出(出栈) 说明 mixed array_pop ( array &$array ) array_pop() 弹出并返回 array 数组的最后一个 ...
- delphi 登陆窗口的问题 [问题点数:30分,结帖人tianhuo_soft]
http://bbs.csdn.net/topics/200053917 有两个窗口formLogin是登陆窗口,formMain是主窗口我想让formMain显示出来,并且formLogin窗口关闭 ...
- Mysql学习实践---SELECT INTO的替代方案
从一个表复制数据,然后把数据插入到另一个新表中. 假设有一个已创建且有数据的orders表,要把orders表备份到还未创建的newOrders表里 SQL用法:SELECT * INTO newOr ...
- 洛谷P4720 【模板】扩展卢卡斯
P4720 [模板]扩展卢卡斯 题目背景 这是一道模板题. 题目描述 求 C(n,m)%P 其中 C 为组合数. 输入输出格式 输入格式: 一行三个整数 n,m,p ,含义由题所述. 输出格式: 一行 ...
- Linux_Centos7_设置MySql定时备份
一.查看是否安装了必要的组件 [root@localhost /]# rpm -qa | grep cron cronie-1.4.11-14.el7_2.1.x86_64 cronie-anacro ...
- c语言基础——基本数据类型
1.基本数据类型是什么?包括有哪些代表?除了基本数据类型还有什么其他类型形式? (1)基本数据类型--用于描述基本的数据 (数.日期等) (2)有整型.实型.字符型.枚举类型等等 ========== ...
- log4j 相对路径
参考: http://elf8848.iteye.com/blog/2008595 log4j.logger.ApiLog=debug,ApiLog log4j.appender.ApiLog=org ...
- bzoj 1012: [JSOI2008]最大数maxnumber (线段树)
1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 13081 Solved: 5654[Subm ...