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

 

 

原创粉丝点击