以前都使用RadGridView控件,里面有自带的GridComboboxColumn,可以很容易实现datagrid中嵌入combobox,而最近试验了系统的datagrid发现内嵌combobox还是出现了很多问题,查了大量资料终于实现,特记录在此。本例使用的模式是Prism+MVVM+RIA的架构,简单贴出关键代码。
一、datagrid中添加模版列,并加入Combobox,设置combobox属性,
<sdk:DataGrid Margin="2" AutoGenerateColumns="False" ItemsSource="{Binding PageView}">
<sdk:DataGrid.Columns>
<sdk:DataGridTextColumn Header="登录账号" Binding="{Binding SACCOUNTCODE}" Width="120" />
<sdk:DataGridTextColumn Header="用户姓名" Binding="{Binding SUSERNAME}" Width="120" />
<sdk:DataGridTemplateColumn Header="所属单位" Width="200">
<sdk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox x:Name="companycode" ItemsSource="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType= telerik:RadWindow},Path=DataContext.GroupList }" DisplayMemberPath="SGROUPNAME" SelectedValuePath="SGROUPID" SelectedValue="{Binding SCOMPANYCODE}" ></ComboBox>
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
</sdk:DataGridTemplateColumn>
</sdk:DataGrid.Columns>
</sdk:DataGrid>
注意:重点是Combobox中的itemdatasource的绑定设置,由于需要寻找此window对应的datacontext,所以需要使用RelativeSource,同时注意 path中要使用DataContext.GroupList 而非直接使用GroupList,另外不要忘了指定SelectedValue的绑定属性,此属性是datagrid中对应的列所要取的值。
2、datagrid及combobox所需绑定的列表,数据可在viewmodel中的方法或事件中加载 PagedCollectionView pageview;
public PagedCollectionView PageView
{
get
{
return pageview;
}
set
{
pageview = value;
RaisePropertyChanged("PageView");
}
}
ObservableCollection<T_SYS_USER> userinfoList = new ObservableCollection<T_SYS_USER>();
public ObservableCollection<T_SYS_USER> UserInfoList
{
get
{
return userinfoList;
}
set
{
userinfoList = value;
RaisePropertyChanged("UserInfoList");
}
}
ObservableCollection<T_SYS_GROUP> groupList = new ObservableCollection<T_SYS_GROUP>();
public ObservableCollection<T_SYS_GROUP> GroupList
{
get
{
return groupList;
}
set
{
groupList = value;
RaisePropertyChanged("GroupList");
}
}
3、datagrid的shell为Radwindow,此处直接指定viewmodel,这里 使用了prism的注入
public partial class UserManagerView : RadWindow,IView
{
public UserManagerView()
{
InitializeComponent();
this.DataContext = ServiceLocator.Current.GetInstance<IViewModel>("UserManageViewModel");
}
}