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);  
         }  
     }  
posted @ 2011-10-31 16:51  kntao  阅读(725)  评论(0编辑  收藏  举报