MVVM-Light模式,在dataGrid的模板下,绑定事件不触发的原因已经服务端排序的实现

如果按以下绑定,DataGrid 模板里的Radio 的绑定事件将不会被触发:

< sdk:DataGrid Grid.Column = "0" x:Name = "dataGrid" IsReadOnly = "True"  AutoGenerateColumns = "False"  Width = "auto" Height = "auto" HorizontalAlignment = "Left" VerticalAlignment = "Top"  
                              ItemsSource = "{Binding NoticeCollection,Mode=TwoWay}" IsTabStop = "False" Style = "{StaticResource DataGridStyle}"  ColumnHeaderStyle = "{StaticResource DataGridColumnHeaderStyle}"  RowStyle = "{StaticResource DataGridRowStyle}"
                        < i:Interaction.Triggers
                            < i:EventTrigger  EventName = "MouseLeftButtonDown"
                                < ei:CallMethodAction  MethodName = "DatagridMouseLeftButtonDown" TargetObject = "{Binding}"
                                </ ei:CallMethodAction
                            </ i:EventTrigger
                        </ i:Interaction.Triggers
                        < sdk:DataGrid.Columns
                            < sdk:DataGridTemplateColumn Header = "选项" Width = "0.1*"
                                < sdk:DataGridTemplateColumn.CellTemplate
                                    < DataTemplate
                                        < StackPanel HorizontalAlignment = "Center" VerticalAlignment = "Top" Margin = "0,7,0,0"
                                            < RadioButton  GroupName = "sel" Command = "{Binding MessageSelected}" CommandParameter = "{Binding Id,Mode=OneWay}" ></ RadioButton
                                        </ StackPanel
                                    </ DataTemplate
                                </ sdk:DataGridTemplateColumn.CellTemplate
                            </ sdk:DataGridTemplateColumn
                            < sdk:DataGridTemplateColumn Header = "标题"  Width = "0.3*"
                                < sdk:DataGridTemplateColumn.CellTemplate
                                    < DataTemplate
                                        < StackPanel HorizontalAlignment = "Left" VerticalAlignment = "Top" Margin = "0,7,0,0"
                                            < HyperlinkButton  Content = "{Binding Title,Mode=OneWay}" Style = "{StaticResource PageHyperlinkButtonStyle}"  Command = "{Binding Source={StaticResource Locator},Path=NoticeListViewModelStatic.ViewMsgCommand}" CommandParameter = "{Binding Id,Mode=OneWay}" /> 
                                        </ StackPanel
                                    </ DataTemplate
                                </ sdk:DataGridTemplateColumn.CellTemplate
                            </ sdk:DataGridTemplateColumn
                            < sdk:DataGridTextColumn Header = "信息内容" Width = "0.4*" Binding = "{Binding Content,Mode=OneWay}" ></ sdk:DataGridTextColumn
                            <!--<sdk:DataGridTextColumn Header="创建时间"   Width="0.2*" Binding="{Binding CreateTime,Mode=OneWay,StringFormat='yyy-MM-dd HH:mm'}"></sdk:DataGridTextColumn>-->
                            < sdk:DataGridTemplateColumn Header = "创建时间" Width = "0.2*"
                                < sdk:DataGridTemplateColumn.CellTemplate
                                    < DataTemplate
                                        < StackPanel HorizontalAlignment = "Center" VerticalAlignment = "Top" Margin = "0,7,0,0"
                                            < TextBlock Text = "{Binding CreateTime,Mode=OneWay,StringFormat='yyy-MM-dd HH:mm'}" /> 
                                        </ StackPanel
                                    </ DataTemplate
                                </ sdk:DataGridTemplateColumn.CellTemplate
                            </ sdk:DataGridTemplateColumn
                        </ sdk:DataGrid.Columns
                    </ sdk:DataGrid >

原因是DataGrid.Columns 不是依赖属性,所有绑定的dataContext将会丢失,所有可以用element-to-element的数据绑定来解决此问题

< sdk:DataGrid Grid.Column = "0" x:Name = "dataGrid" IsReadOnly = "True"  AutoGenerateColumns = "False"  Width = "auto" Height = "auto" HorizontalAlignment = "Left" VerticalAlignment = "Top"  
                     ItemsSource = "{Binding NoticeCollection,Mode=TwoWay}" IsTabStop = "False" Style = "{StaticResource DataGridStyle}"  ColumnHeaderStyle = "{StaticResource DataGridColumnHeaderStyle}"  RowStyle = "{StaticResource DataGridRowStyle}"
               < i:Interaction.Triggers
                   < i:EventTrigger  EventName = "MouseLeftButtonDown"
                       < ei:CallMethodAction  MethodName = "DatagridMouseLeftButtonDown" TargetObject = "{Binding}"
                       </ ei:CallMethodAction
                   </ i:EventTrigger
               </ i:Interaction.Triggers
               < sdk:DataGrid.Columns
                   < sdk:DataGridTemplateColumn Header = "选项" Width = "0.1*"
                       < sdk:DataGridTemplateColumn.CellTemplate
                           < DataTemplate
                               < StackPanel HorizontalAlignment = "Center" VerticalAlignment = "Top" Margin = "0,7,0,0"
                                   < RadioButton  GroupName = "sel" Command = "{Binding Source={StaticResource Locator},Path=NoticeListViewModelStatic.MessageSelected}" CommandParameter = "{Binding Id,Mode=OneWay}" ></ RadioButton
                               </ StackPanel
                           </ DataTemplate
                       </ sdk:DataGridTemplateColumn.CellTemplate
                   </ sdk:DataGridTemplateColumn
                   < sdk:DataGridTemplateColumn Header = "标题"  Width = "0.3*"
                       < sdk:DataGridTemplateColumn.CellTemplate
                           < DataTemplate
                               < StackPanel HorizontalAlignment = "Left" VerticalAlignment = "Top" Margin = "0,7,0,0"
                                   < HyperlinkButton  Content = "{Binding Title,Mode=OneWay}" Style = "{StaticResource PageHyperlinkButtonStyle}"  Command = "{Binding Source={StaticResource Locator},Path=NoticeListViewModelStatic.ViewMsgCommand}" CommandParameter = "{Binding Id,Mode=OneWay}" /> 
                               </ StackPanel
                           </ DataTemplate
                       </ sdk:DataGridTemplateColumn.CellTemplate
                   </ sdk:DataGridTemplateColumn
                   < sdk:DataGridTextColumn Header = "信息内容" Width = "0.4*" Binding = "{Binding Content,Mode=OneWay}" ></ sdk:DataGridTextColumn
                   <!--<sdk:DataGridTextColumn Header="创建时间"   Width="0.2*" Binding="{Binding CreateTime,Mode=OneWay,StringFormat='yyy-MM-dd HH:mm'}"></sdk:DataGridTextColumn>-->
                   < sdk:DataGridTemplateColumn Header = "创建时间" Width = "0.2*"
                       < sdk:DataGridTemplateColumn.CellTemplate
                           < DataTemplate
                               < StackPanel HorizontalAlignment = "Center" VerticalAlignment = "Top" Margin = "0,7,0,0"
                                   < TextBlock Text = "{Binding CreateTime,Mode=OneWay,StringFormat='yyy-MM-dd HH:mm'}" /> 
                               </ StackPanel
                           </ DataTemplate
                       </ sdk:DataGridTemplateColumn.CellTemplate
                   </ sdk:DataGridTemplateColumn
               </ sdk:DataGrid.Columns
           </ sdk:DataGrid >

顺便提一下,silverlight的dataGrid在MVVM模式下的排序事件实现:

在View里声明出发前:

< i:Interaction.Triggers
                           < i:EventTrigger  EventName = "MouseLeftButtonDown"
                               < ei:CallMethodAction  MethodName = "DatagridMouseLeftButtonDown" TargetObject = "{Binding}"
                               </ ei:CallMethodAction
                           </ i:EventTrigger
                       </ i:Interaction.Triggers >

在ViewModel里实现方法:

public void DatagridMouseLeftButtonDown( object sender, MouseButtonEventArgs e) 
    
         var u = 
             from element in VisualTreeHelper.FindElementsInHostCoordinates(e.GetPosition( null ), sender as UIElement) 
             where element is DataGridColumnHeader 
             select element; 
         if (u.Count() == 1) 
        
             e.Handled = true
             var columnTag = ConvertColumnName(((DataGridColumnHeader)u.Single()).Content.ToString()); 
             if ( string .IsNullOrEmpty(columnTag) || columnTag == "Serial" || columnTag == "Do"
                 return
             Ascning = (OrderColumn == columnTag) && !Ascning; 
             OrderColumn = columnTag; 
             PagerInfo p = new PagerInfo(); 
             p.PageSize = this ._pagesize; 
             p.PageIndex = 1; 
             this .PagerContext.MoveToFirstPage(); 
             SortType = Ascning ? "ASC" : "DESC"
             searchData(p, OrderColumn, SortType); 
        
     }

你可能感兴趣的:(datagrid)