您的位置:首页 > 其它

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

2012-10-17 11:50 579 查看
整体需求及适用环境:

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: