赞
踩
整体需求及适用环境:
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。