如果以下绑定,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);
}
}