整体需求及适用环境:
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框架下,通过ComboBox选择更新实体列表中实体的特定属性,并在ComboBox事件中处理逻辑。详细展示了XAML代码实现、页面交互逻辑及ViewModel的简单实现,包括实体类、模拟ViewModel和枚举类型等。通过实例代码演示了如何在页面中实时监视实体属性的变化。

1074

被折叠的 条评论
为什么被折叠?



