以前都使用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");
}
}