当前位置:   article > 正文

WPF之MVVM中DataGrid中嵌入Combox,改变Combox可回传至绑定的实体_mvvm中combox

mvvm中combox

整体需求及适用环境:

1.WPF下的MVVM框架下

2.DataGrid绑定的实体列表的实体的某个属性是通过选择输入或者维护的,此处使用Combox模拟单值可选属性,在ComBox的SelectedValue发生变化时,需要更新该条实体的该属性

3.在ComBox的事件中也可以处理,但是这样就在页面的后天页面中加入了关于ViewModel的逻辑,有些丑陋

页面代码如下,为监视实体的属性发生变化,特意添加了一个TextBlock来监视当前实体的该属性值

  1. <DataGrid Name="grid_UserList" ItemsSource="{Binding ModelList}" AutoGenerateColumns="False" CanUserAddRows="False">
  2. <DataGrid.Columns>
  3. <DataGridTextColumn Header="姓名" Binding="{Binding UserName}" Width="*" IsReadOnly="True" />
  4. <DataGridTextColumn Header="ID" Binding="{Binding UserId}" Width="100" IsReadOnly="True" />
  5. <DataGridTemplateColumn Header="职业" Width="*" >
  6. <DataGridTemplateColumn.CellTemplate>
  7. <DataTemplate>
  8. <StackPanel>
  9. <ComboBox x:Name="cb_Type"
  10. ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.TypeList}"
  11. DisplayMemberPath="DisplayName"
  12. SelectedValue="{Binding UserType, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
  13. SelectedValuePath="EnumValue"/>
  14. <!--为了看出改变Combox时,改变了当前选中实体的UserType属性,通过下面的TextBlock的Text的绑定来监视-->
  15. <TextBlock Text="{Binding UserType}"></TextBlock>
  16. </StackPanel>
  17. </DataTemplate>
  18. </DataGridTemplateColumn.CellTemplate>
  19. </DataGridTemplateColumn>
  20. </DataGrid.Columns>
  21. </DataGrid>

上面的Xaml代码中需要注意的地方:

1.Combox的Source绑定,在Bing的时候,通过指定RelativeSource去绑定(不是DataGrid的DataContext)特殊的数据集合,AncestorType,顾名思义就是“祖宗的类别”,可以指定为窗体:Window;用户控件 UserControl等等,意思是找到这个级别的DataContex,然后指定Path;整体来说:计算机是很傻的,你需要明确的告诉它,要怎么玩,它才会玩去。

2.Combox的SelectedValue的bing属性中的UpdateSourceTrigger=PropertyChanged,它的意思是当前选中值发生变化时,更新回绑定的实体属性中


View的后台代码很简单,(注意,正式使用过程中ViewModel是通过构造函数或者属性进行注入的)

  1. /// <summary>
  2. /// MainWindow.xaml 的交互逻辑
  3. /// </summary>
  4. public partial class MainWindow : Window
  5. {
  6. public MainWindow()
  7. {
  8. InitializeComponent();
  9. //此处应该通过属性或者构造函数注入的,此处简单实现
  10. DataContext = new ViewModel();
  11. }
  12. }


下面是模拟ViewModel的实现,因为是简单的小Demo,相关代码都放到了一个文件中,正式项目中不建议这么做

  1. /// <summary>
  2. /// 模拟ViewModel
  3. /// </summary>
  4. public class ViewModel
  5. {
  6. public ObservableCollection<Model> ModelList
  7. {
  8. get
  9. {
  10. return new ObservableCollection<Model>()
  11. {
  12. new Model(){UserName="甲",UserId="1",UserType=UserTypeEnum.Teacher},
  13. new Model(){UserName="乙",UserId="2",UserType=UserTypeEnum.Student},
  14. new Model(){UserName="甲",UserId="3",UserType=UserTypeEnum.Free_Agent},
  15. new Model(){UserName="甲",UserId="4",UserType=UserTypeEnum.Staff},
  16. };
  17. }
  18. }
  19. public ObservableCollection<UserTypeInfo> TypeList
  20. {
  21. get
  22. {
  23. return new ObservableCollection<UserTypeInfo>()
  24. {
  25. new UserTypeInfo(){DisplayName="教师",EnumValue=UserTypeEnum.Teacher},
  26. new UserTypeInfo(){DisplayName="学生",EnumValue=UserTypeEnum.Student},
  27. new UserTypeInfo(){DisplayName="自由职业者",EnumValue=UserTypeEnum.Free_Agent},
  28. new UserTypeInfo(){DisplayName="职员",EnumValue=UserTypeEnum.Staff},
  29. };
  30. }
  31. }
  32. }
  33. /// <summary>
  34. /// 模拟实体类
  35. /// </summary>
  36. public class Model
  37. {
  38. public string UserName
  39. { get; set; }
  40. public string UserId
  41. { get; set; }
  42. public UserTypeEnum UserType
  43. {
  44. get;
  45. set;
  46. }
  47. }
  48. /// <summary>
  49. /// 模拟实体类中某个属性的枚举值
  50. /// </summary>
  51. public enum UserTypeEnum
  52. {
  53. Student,
  54. Teacher,
  55. Free_Agent,
  56. Staff
  57. }
  58. /// <summary>
  59. /// 模拟类别类
  60. /// </summary>
  61. public class UserTypeInfo
  62. {
  63. public string DisplayName { get; set; }
  64. public UserTypeEnum EnumValue { get; set; }
  65. }


项目源码,源码地址:http://download.csdn.net/detail/yanbuodiao/4655553

 

 

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号