WPF使用DataGridComboBoxColumn完成绑定
来源:互联网 发布:程序员考试报名时间 编辑:程序博客网 时间:2024/06/05 02:56
在使用DataGrid的时候,有时候需要使某些列为ComboBox,这时自然想到使用DataGridComboBoxColumn,但是如果使用的是ItemsSource数据绑定后台的对象,就会发现,这根本就不能用。
首先,看有问题的代码:
1 using System.Windows; 2 using System.Collections.ObjectModel; 3 using System.ComponentModel; 4 5 namespace WPFTest 6 { 7 /// <summary> 8 /// 数据项 9 /// </summary>10 public class DataItem11 {12 public int Value { get; set; }13 public DataItem(int val) { Value = val; }14 }15 /// <summary>16 /// MainWindow.xaml 的交互逻辑17 /// </summary>18 public partial class MainWindow : Window19 {20 public MainWindow()21 {22 InitializeComponent();23 // 选中数据24 SelectedList.Add(new DataItem(1)); SelectedList.Add(new DataItem(2));25 // 可选数据26 SelectionList.Add(1); SelectionList.Add(2); SelectionList.Add(3);27 }28 29 /// <summary>30 /// 选中的数据列表31 /// </summary>32 public ObservableCollection<DataItem> SelectedList33 {34 get { return _selectedList; }35 set { _selectedList = value; }36 }37 private ObservableCollection<DataItem> _selectedList = new ObservableCollection<DataItem>();38 39 /// <summary>40 /// 可供选择的数据列表41 /// </summary> 42 public ObservableCollection<int> SelectionList43 {44 get { return _selectionList; }45 set { _selectionList = value; }46 }47 private ObservableCollection<int> _selectionList = new ObservableCollection<int>();48 49 // 显示选中的50 private void Button_Click(object sender, RoutedEventArgs e)51 {52 TBX_Selected.Text = "";53 foreach (var item in SelectedList)54 TBX_Selected.Text += item.Value.ToString(" --->0<--- ");55 }56 57 }58 }
前台为:
1 <Window x:Class="WPFTest.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 Title="WPFTest" Name="this" Height="350" Width="525"> 5 <StackPanel> 6 <DataGrid ItemsSource="{Binding Path=SelectedList,ElementName=this}" AutoGenerateColumns="False"> 7 <DataGrid.Columns> 8 <DataGridTextColumn Header="文本模式" Binding="{Binding Path=Value}" /> 9 <DataGridComboBoxColumn Header="ComboBox模式"10 SelectedValueBinding="{Binding Path=Value}"11 ItemsSource="{Binding Path=SelectionList,ElementName=this}" /> 12 </DataGrid.Columns>13 </DataGrid>14 <Button Content="观察选中的数据" Click="Button_Click" Margin="10"/>15 <TextBox Name="TBX_Selected" />16 </StackPanel>17 </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:
1 <DataGridTemplateColumn Header="Template模式">2 <DataGridTemplateColumn.CellTemplate>3 <DataTemplate>4 <ComboBox SelectedValue="{Binding Path=Value}" ItemsSource="{Binding Path=SelectionList,ElementName=this}" /> 5 </DataTemplate>6 </DataGridTemplateColumn.CellTemplate>7 </DataGridTemplateColumn>
运行发现,显示是正常了,但是不论我怎么改,SelectedList中的数据都不带改变,我尝试设置了ComboBox的各项属性,也没有成功。但是非常奇怪的地方是,如果在选择后,去点了上面的DataGridComboBoxColumn ,数据就能正常正同步过去:
我想这可能是DataGridComboBoxColumn在选择后会触发一个事件,完成同步工作。
好了,这样还是不行,我去了stackoverflow上找资料,问题终于得到了解决。基本上原因是这样的:DataGrid的列并没有数据上下文,所以DataGridTemplateColumn中的ComoBox从未添加到“Visual Tree(可视化树)”中。只要Grid绘制了单元,并且得到了数据上下文后,就能正常地使用ItemsSource属性来完成绑定了。修正后的代码:
1 <DataGridComboBoxColumn Header="ComboBox模式(修正)">2 <DataGridComboBoxColumn.EditingElementStyle>3 <Style TargetType="ComboBox">4 <Setter Property="ItemsSource" Value="{Binding Path=SelectionList,ElementName=this}" />5 <Setter Property="SelectedValue" Value="{Binding Path=Value}" />6 </Style>7 </DataGridComboBoxColumn.EditingElementStyle>8 </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使用DataGridComboBoxColumn完成绑定
- wpf datagrid中的 DataGridComboBoxColumn数据绑定
- WPF DataGridComboBoxColumn的使用方法
- WPF使用MVVM完成DataGrid数据绑定带全选
- DataGrid和DataGridComboBoxColumn数据绑定
- datagrid中的 DataGridComboBoxColumn数据绑定
- WPF datagrid 中 DataGridComboBoxColumn 和 DataGridCheckBoxColumn 使用方法
- DataGridComboBoxColumn绑定后显示空白的问题
- WPF使用代码进行绑定
- WPF使用异步绑定数据
- WPF使用代码进行绑定
- WPF中使用XmlDataProvider做控件绑定
- WPF中使用ObjectDataProvider绑定方法
- WPF使用资源绑定自定义类型
- WPF使用资源绑定自定义类型
- 在WPF中如何使用RelativeSource绑定
- MVVM WPF 使用 datagrid 绑定 comboBox
- cocos2d-x节点(b2CircleShape.h)API
- acm--杨辉三角
- iOS app 状态栏隐藏与颜色
- 从Java代码远程提交YARN MapReduce任务
- RUBY 和 SQLITE
- WPF使用DataGridComboBoxColumn完成绑定
- win7+ubuntu双系统安装方法
- quick-cocos2d-x下有关缓存图片的管理策略
- mysql 分页拦截器,类似hibernate方言
- Redis 代理服务Twemproxy
- ASP.NET MVC项目设置起始页后问题的修复
- Python subprocess shell 编程规范
- c语言中可以用fseek来定位文件指针的位置
- 不可忽视的锚文本-永生SEO