Bạn có thể thực hiện việc này bằng cách sửa đổi mẫu điều khiển cho DataGridRows được DataGrid tiếp xúc. Ví dụ dưới đây sử dụng WPF và chủ đề Aero.
Điều duy nhất tôi đã thực hiện được xóa cal trước đó của bạn: Message.Attach gọi và di chuyển nó đến một "giữ chỗ" ContentControl mới bao quanh Border (x: Name = DGR_Border) trong mẫu điều khiển "mặc định". (Tôi đã từng ContentControl vì nó không có hình ảnh của riêng nó và nó cho thấy một sự kiện MouseDoubleClick.)
<DataGrid Width="Auto"
SelectionMode="Extended"
IsReadOnly="True"
Name="ListDataGrid"
AutoGenerateColumns="False"
ItemsSource="{Binding ListFieldObject.MoviesList}"
DataContext="{StaticResource MovieAppViewModel}">
<DataGrid.Columns>
<DataGridTextColumn Width="200" IsReadOnly="True" Header="Title" Binding="{Binding Title}"/>
<DataGridTextColumn Width="100" IsReadOnly="True" Header="Rating" Binding="{Binding Rating}"/>
<DataGridTextColumn Width="100" IsReadOnly="True" Header="Stars" Binding="{Binding Stars}"/>
<DataGridTextColumn Width="93" IsReadOnly="True" Header="Release Year" Binding="{Binding ReleaseYear}"/>
</DataGrid.Columns>
<DataGrid.RowStyle>
<Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.WindowBrushKey}}"/>
<Setter Property="SnapsToDevicePixels" Value="true"/>
<Setter Property="Validation.ErrorTemplate" Value="{x:Null}"/>
<Setter Property="ValidationErrorTemplate">
<Setter.Value>
<ControlTemplate>
<TextBlock Foreground="Red" Margin="2,0,0,0" Text="!" VerticalAlignment="Center"/>
</ControlTemplate>
</Setter.Value>
</Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridRow}">
<ContentControl cal:Message.Attach="[Event MouseDoubleClick] = [Action RowSelect($datacontext)]">
<Border x:Name="DGR_Border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
<SelectiveScrollingGrid>
<SelectiveScrollingGrid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</SelectiveScrollingGrid.ColumnDefinitions>
<SelectiveScrollingGrid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</SelectiveScrollingGrid.RowDefinitions>
<DataGridCellsPresenter Grid.Column="1" ItemsPanel="{TemplateBinding ItemsPanel}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
<DataGridDetailsPresenter Grid.Column="1" Grid.Row="1" SelectiveScrollingGrid.SelectiveScrollingOrientation="{Binding AreRowDetailsFrozen, ConverterParameter={x:Static SelectiveScrollingOrientation.Vertical}, Converter={x:Static DataGrid.RowDetailsScrollingConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" Visibility="{TemplateBinding DetailsVisibility}"/>
<DataGridRowHeader Grid.RowSpan="2" SelectiveScrollingGrid.SelectiveScrollingOrientation="Vertical" Visibility="{Binding HeadersVisibility, ConverterParameter={x:Static DataGridHeadersVisibility.Row}, Converter={x:Static DataGrid.HeadersVisibilityConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"/>
</SelectiveScrollingGrid>
</Border>
</ContentControl>
</ControlTemplate>
</Setter.Value>
</Setter>
</DataGrid.RowStyle>
</DataGrid>
Chỉ có điều khác bạn sẽ phải làm là thay đổi phương pháp RowSelect() của bạn để chấp nhận một tham số của bất cứ điều gì loại bạn đang sử dụng ở đây (tôi chỉ cho rằng đó là loại 'Phim').
public void RowSelect(Movie movie)
{
// do something with 'movie'
}
Từ những gì tôi có thể nói đó là rất khó khăn nếu không muốn nói là không thể. Rất nhiều trang web thảo luận về điều này, ví dụ: http://www.scottlogic.co.uk/blog/colin/2008/12/wpf-datagrid-phát hiện được nhấp-ô-và-hàng/và http://stackoverflow.com/questions/5808616/how-to-bind-a-command-to- này double-click-on-a-row-in-datagrid – Phil