WPF Datagrid.SelectedItem的用法实践

WCF+WPF的一个项目,有两个页面具有相似的结构,一个是未读消息清单,一个是用户列表,前端都是用WPF的Datagrid实现,但是后端写的逻辑有较大差别,WCF的Message服务返回的是TRMessage类,而用户列表返回的是Datatable。前者实现起来觉得累,后来偷懒就改用Datatable了。结果出现了问题。


Message这段直接把数组给加到了datagrid的数据源,工作也正常。

        public void UpdateSource()
        {
            dataGrid_messagelist.SelectionChanged += OnMessage_Click;
            Message[] messagelist;
            try
            {
                messagelist = Portal.GetMessageList(current_user, currentPageIndex, pageSize);
                //给datagrid加上数据源 
                if (messagelist != null)
                {
                    dataGrid_messagelist.ItemsSource = messagelist;
                }
            }
            catch
            { }
        }
前端代码:

            
            
                
                
                
                
                
                
            
        

当用户点击datagrid的时候,触发的响应:

        private void OnMessage_Click(object sender, SelectionChangedEventArgs e)
        {
            //要删除datagrid的选择响应,否则跳回来的时候,相当于一次selectionchange选择变更,会导致再次跳转
            dataGrid_messagelist.SelectionChanged -= OnMessage_Click;

            int mUID = ((((DataGrid)sender).SelectedItem) as Message).MessageID;//!!!这里把sender强制转回了datagrid,其选中的selecteditem转为Message对象,因而能够获取到其messageID
            //。。。。余下代码省略,关键是取得了MessageID后能够向服务器请求相应的Message详细内容,然后进行相应处理
        }

上述代码工作没有问题。但是做用户列表的时候,如法炮制,所不同的是WCF服务返回了DataTable。把DataTable绑定给DataGrid也正常: 

dataGrid_userlist.ItemsSource = userlistTable.DefaultView;
这是常见的写法,没有问题。但是套用Message列表实现的代码的时候,由于服务器返回的是DataTable了,代码相应做了修改,但是始终不能正确转换类型:

        private void OnMessage_Click(object sender, SelectionChangedEventArgs e)
        {
            //string userName = ((((DataGrid)sender).SelectedItem) as DataGridRow)["userName"].toString();//错误代码
            //string userName = ((((DataGrid)sender).SelectedItem) as User).["userName"].ToString();//错误代码
	    //string userName = ((((DataGrid)sender).SelectedItem) as DataRow).["userName"].ToString();//错误代码
  
            string userName = ((((DataGrid)sender).SelectedItem) as DataRowView)["userName"].ToString();//正确代码,能够获得userName了 
            //....余下代码省略
         }
上述代码错误在于,SelectionChanged事件委托传递参数sender携带的对象类型并不是DataTable或者DataGrid,而是DataView对象。这一点从绑定数据源的时候就应该注意到:
dataGrid_userlist.ItemsSource = userlistTable.DefaultView;
绑定的是Datatable的DefaultView属性。因此,SelectedItem也应该转换为对应的DataRowView,而不是DataRow或者DataGridRow。这样,以数组名称操作方式从中取出所需的字段就非常容易了。

你可能感兴趣的:(.NET,WPF)