WPF之MVVM中DataGrid中嵌入Combox,改变Combox可回传至绑定的实体
来源:互联网 发布:电信为什么禁用80端口 编辑:程序博客网 时间:2024/04/25 10:11
整体需求及适用环境:
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中嵌入Combox,改变Combox可回传至绑定的实体
- WPF 中combox与datagrid绑定
- DataGrid中的子控件Combox之数据源绑定(WPF)
- C#中Combox的绑定总结
- 【flex4】datagrid中使用combox
- WPF 中通过ComBox的改变来改变Frame中的子.xaml项 View-ViewModel模式
- WPF combox数据绑定的问题
- WPF Combox selectedItem”不能绑定”的问题
- datagrid 绑定 combox 取值
- 如何在JS中改变Extjs combox 的值
- C# winform中,动态绑定textbox,combox,datagridview的示例
- C#中Combox绑定集合,设置DisplayMember
- c#中combox绑定datatable数据源
- winform中combox的运用
- wpf中datagrid绑定数据源发生改变
- Xceed Datagrid for Wpf中带有可编辑combox项做法实例
- wpf combox的绑定与设置选择项
- wpf combox的绑定与设置选择项
- <每日一句英语> 2012-10-17
- 1020. Big Integer
- Eclipse中10个最有用的快捷键组合
- 在ASP.NET中以(.ashx)为结尾对session的访问
- 隐藏当前窗口/守护进程
- WPF之MVVM中DataGrid中嵌入Combox,改变Combox可回传至绑定的实体
- 我在江北学安全(六) XSS-Scan系统原理图解分析 及 XSSer代码分析
- Linux中搜索大于200M的文件
- 自己动手构建Key-Value Store系统
- c#函数成员
- 编译Chrome时遇到FOLDERID_ApplicationShortcuts未定义的问题
- 64位程序设计-该使用什么编译宏呢
- 从输入网址到网页显示过程
- 手机测试Android程序