WPF之MVVM中DataGrid中嵌入Combox,改变Combox可回传至绑定的实体
2012-10-17 11:50
579 查看
整体需求及适用环境:
1.WPF下的MVVM框架下
2.DataGrid绑定的实体列表的实体的某个属性是通过选择输入或者维护的,此处使用Combox模拟单值可选属性,在ComBox的SelectedValue发生变化时,需要更新该条实体的该属性
3.在ComBox的事件中也可以处理,但是这样就在页面的后天页面中加入了关于ViewModel的逻辑,有些丑陋
页面代码如下,为监视实体的属性发生变化,特意添加了一个TextBlock来监视当前实体的该属性值
上面的Xaml代码中需要注意的地方:
1.Combox的Source绑定,在Bing的时候,通过指定RelativeSource去绑定(不是DataGrid的DataContext)特殊的数据集合,AncestorType,顾名思义就是“祖宗的类别”,可以指定为窗体:Window;用户控件 UserControl等等,意思是找到这个级别的DataContex,然后指定Path;整体来说:计算机是很傻的,你需要明确的告诉它,要怎么玩,它才会玩去。
2.Combox的SelectedValue的bing属性中的UpdateSourceTrigger=PropertyChanged,它的意思是当前选中值发生变化时,更新回绑定的实体属性中
View的后台代码很简单,(注意,正式使用过程中ViewModel是通过构造函数或者属性进行注入的)
下面是模拟ViewModel的实现,因为是简单的小Demo,相关代码都放到了一个文件中,正式项目中不建议这么做
待会贴出项目源码,源码地址:http://download.csdn.net/detail/yanbuodiao/4655553
1.WPF下的MVVM框架下
2.DataGrid绑定的实体列表的实体的某个属性是通过选择输入或者维护的,此处使用Combox模拟单值可选属性,在ComBox的SelectedValue发生变化时,需要更新该条实体的该属性
3.在ComBox的事件中也可以处理,但是这样就在页面的后天页面中加入了关于ViewModel的逻辑,有些丑陋
页面代码如下,为监视实体的属性发生变化,特意添加了一个TextBlock来监视当前实体的该属性值
<DataGrid Name="grid_UserList" ItemsSource="{Binding ModelList}" AutoGenerateColumns="False" CanUserAddRows="False"> <DataGrid.Columns> <DataGridTextColumn Header="姓名" Binding="{Binding UserName}" Width="*" IsReadOnly="True" /> <DataGridTextColumn Header="ID" Binding="{Binding UserId}" Width="100" IsReadOnly="True" /> <DataGridTemplateColumn Header="职业" Width="*" > <DataGridTemplateColumn.CellTemplate> <DataTemplate> <StackPanel> <ComboBox x:Name="cb_Type" ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.TypeList}" DisplayMemberPath="DisplayName" SelectedValue="{Binding UserType, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" SelectedValuePath="EnumValue"/> <!--为了看出改变Combox时,改变了当前选中实体的UserType属性,通过下面的TextBlock的Text的绑定来监视--> <TextBlock Text="{Binding UserType}"></TextBlock> </StackPanel> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> </DataGrid.Columns> </DataGrid>
上面的Xaml代码中需要注意的地方:
1.Combox的Source绑定,在Bing的时候,通过指定RelativeSource去绑定(不是DataGrid的DataContext)特殊的数据集合,AncestorType,顾名思义就是“祖宗的类别”,可以指定为窗体:Window;用户控件 UserControl等等,意思是找到这个级别的DataContex,然后指定Path;整体来说:计算机是很傻的,你需要明确的告诉它,要怎么玩,它才会玩去。
2.Combox的SelectedValue的bing属性中的UpdateSourceTrigger=PropertyChanged,它的意思是当前选中值发生变化时,更新回绑定的实体属性中
View的后台代码很简单,(注意,正式使用过程中ViewModel是通过构造函数或者属性进行注入的)
/// <summary> /// MainWindow.xaml 的交互逻辑 /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); //此处应该通过属性或者构造函数注入的,此处简单实现 DataContext = new ViewModel(); } }
下面是模拟ViewModel的实现,因为是简单的小Demo,相关代码都放到了一个文件中,正式项目中不建议这么做
/// <summary> /// 模拟ViewModel /// </summary> public class ViewModel { public ObservableCollection<Model> ModelList { get { return new ObservableCollection<Model>() { new Model(){UserName="甲",UserId="1",UserType=UserTypeEnum.Teacher}, new Model(){UserName="乙",UserId="2",UserType=UserTypeEnum.Student}, new Model(){UserName="甲",UserId="3",UserType=UserTypeEnum.Free_Agent}, new Model(){UserName="甲",UserId="4",UserType=UserTypeEnum.Staff}, }; } } public ObservableCollection<UserTypeInfo> TypeList { get { return new ObservableCollection<UserTypeInfo>() { new UserTypeInfo(){DisplayName="教师",EnumValue=UserTypeEnum.Teacher}, new UserTypeInfo(){DisplayName="学生",EnumValue=UserTypeEnum.Student}, new UserTypeInfo(){DisplayName="自由职业者",EnumValue=UserTypeEnum.Free_Agent}, new UserTypeInfo(){DisplayName="职员",EnumValue=UserTypeEnum.Staff}, }; } } } /// <summary> /// 模拟实体类 /// </summary> public class Model { public string UserName { get; set; } public string UserId { get; set; } public UserTypeEnum UserType { get; set; } } /// <summary> /// 模拟实体类中某个属性的枚举值 /// </summary> public enum UserTypeEnum { Student, Teacher, Free_Agent, Staff } /// <summary> /// 模拟类别类 /// </summary> public class UserTypeInfo { public string DisplayName { get; set; } public UserTypeEnum EnumValue { get; set; } }
待会贴出项目源码,源码地址:http://download.csdn.net/detail/yanbuodiao/4655553
相关文章推荐
- WPF--MVVM之DataGrid ComboBox数据源绑定枚举
- WPF--MVVM之DataGrid数据源绑定
- wpf mvvm datagrid DataGridTemplateColumn的绑定无效的可能原因之一!
- wpf中datagrid绑定数据源发生改变
- MVVM WPF 使用 datagrid 绑定 comboBox
- WPF使用MVVM完成DataGrid数据绑定带全选
- 黑马程序员--wpf学习笔记五----说说ListBox\DataGrid与数据绑定的那点事
- wpf DATAgrid模板中button 命令绑定以及命令参数绑定
- WPF中DataGrid控件内Button的Command和CommandParameter的绑定
- 泛型与反射机制处理ComBox绑定的数据源是List<实体对象>
- 怎么在绑定后动态改变DataGrid中的内容
- WPF 4 中DataGrid的模板列做双向数据绑定
- WPF DataGrid 之数据绑定
- WPF 如何在后台进行控件属性的绑定MVVM
- MVVM 开发模式 dataGrid中嵌入combobox,如何使用ComboBox.ItemTemplate
- WPF 中combox与datagrid绑定
- WPF 绑定集合 根据集合个数改变样式 INotifyCollectionChanged
- C# WPF MVVM 实战 – 5- 用绑定,通过 VM 设置 View 的控件焦点
- WPF DataGrid Visibility的绑定
- WPF中DataGrid使用自定义列绑定数据