微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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");
        }
    }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐