Silverlight中使用MVVM方式進行datagrid的內嵌combobox方法

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章