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,command,header,binding,RadioButton,DataTemplate)