2010-10-06 7 views
23

Tôi biết cách sử dụng sự kiện MouseDoubleClick với DataGrid để lấy giá trị đã chọn, nhưng làm cách nào để sử dụng các liên kết lệnh thay thế? Bằng cách đó, ViewModel của tôi có thể xử lý logic.WPF DataGrid: CommandBinding nhấp đúp thay vì sử dụng Sự kiện

Cho đến nay tôi có như sau:

<DataGrid Name="TestGrid" Grid.Row="2" Grid.ColumnSpan="2" AutoGenerateColumns="True" MouseDoubleClick="TestGrid_MouseDoubleClick" 
      ItemsSource="{Binding Registrations}" SelectedValue="{Binding CurrentRegistration}" IsReadOnly="True" AlternationCount="2" GridLinesVisibility="None"> 

Tôi muốn thoát khỏi MouseDoubleClick và thay thế nó một cách thích hợp.

Trả lời

2

Bạn đã kiểm tra post này, cung cấp toàn bộ giải pháp ...

+7

Tôi đã tìm kiếm StackOverflow, nhưng tôi hiếm khi đi đến trang web MSDN. Thành thật mà nói, câu trả lời ở đây là 99% thời gian tốt hơn và nhiều hơn nữa cho vấn đề. Tôi sẽ thử điều này và nếu nó hoạt động, bạn sẽ nhận được dấu kiểm. :) –

+4

câu trả lời chỉ là một liên kết, không có thông tin khác được cung cấp – Maslow

+0

Tôi đã làm điều này, và nó làm việc tuyệt vời, nhưng nó can thiệp vào hành vi của các hộp kiểm tra và các nút radio mà tôi có trong DataGrid. Tôi đã dành rất nhiều công việc để bù đắp cho việc này, nhưng sau đó tôi đã thử giải pháp của Tamar Cohen bên dưới, điều này đơn giản hơn nhiều và cho phép các hộp kiểm tra/radio của tôi hoạt động không cần phải sửa đổi. – Tim

2

Sử dụng this library

mẫu gắn vào sự kiện DataGrid:

<DataGrid xmlns:command="clr-namespace:AttachedCommandBehavior;assembly=AttachedCommandBehavior" 
    command:CommandBehavior.Event="MouseDoubleClick" 
    command:CommandBehavior.Command="{Binding TestCommand}" /> 

Nhưng mã này là tốt hơn, vì làm tăng các nhấp chuột hàng chỉ:

<DataGrid> 
    <DataGrid.Resources> 
     <Style TargetType="DataGridRow"> 
      <Setter Property="command:CommandBehavior.Event" Value="MouseDoubleClick"/> 
      <Setter Property="command:CommandBehavior.Command" Value="{Binding DataContext.TestCommand, RelativeSource={RelativeSource FindAncestor, AncestorType=DataGrid}}"/> 
     </Style> 
    </DataGrid.Resources> 
</DataGrid> 
+0

Tôi thích thư viện, nhưng dường như nó chứa đựng nhiều hơn những gì tôi cần (cho thời điểm này).Tôi sẽ xem xét thư viện và nếu tôi cần nhiều hơn lệnh nhấp đúp thì có lẽ điều này sẽ chứa các lệnh khác mà tôi không bận tâm. –

+0

@myermian Bạn cũng có thể xem MVVM Light, nó có lớp tương tự và các lớp khác giúp sử dụng mẫu MVVM. Đối với tôi, việc thêm tham chiếu vào thư viện dễ hơn là sao chép mã, nhưng đó là câu hỏi gây tranh cãi cho dù bạn có sử dụng thư viện của bên thứ ba hay viết thư của riêng mình hay không. – vorrtex

1

Hoặc, bạn có thể tạo một lớp có nguồn gốc

public class CustomDataGrid : DataGrid 
{ 
    public ICommand DoubleClickCommand 
    { 
     get { return (ICommand)GetValue(DoubleClickCommandProperty); } 
     set { SetValue(DoubleClickCommandProperty, value); } 
    } 

    // Using a DependencyProperty as the backing store for DoubleClickCommand. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty DoubleClickCommandProperty = 
     DependencyProperty.Register("DoubleClickCommand", typeof(ICommand), typeof(CustomDataGrid), new UIPropertyMetadata()); 

    public CustomDataGrid() 
     : base() 
    {    
     this.PreviewMouseDoubleClick += new MouseButtonEventHandler(CustomDataGrid_PreviewMouseDoubleClick); 
    } 


    void CustomDataGrid_PreviewMouseDoubleClick(object sender, MouseButtonEventArgs e) 
    { 
     if (DoubleClickCommand != null) 
     { 
      DoubleClickCommand.Execute(null); 
     } 
    } 


} 

và trong XAML chỉ đơn giản là liên kết với các lệnh mới được tạo ra

<CustomDataGrid DoubleClickCommand="{Binding DoubleClickCommand}"> 
14

Một giải pháp khác là thêm bindings đầu vào, và để ràng buộc SelectedItem đến một bất động sản vì vậy bạn sẽ biết ai đã được chọn:

<DataGrid SelectedItem="{Binding SelectedItem}"> 
     <DataGrid.InputBindings> 
      <MouseBinding Gesture="LeftDoubleClick" Command="{Binding SomeCommand}"/> 
    </DataGrid.InputBindings> 
</DataGrid> 
+0

Đẹp và thanh lịch. – MaYaN

48

Không cần hành vi đính kèm hoặc lớp con DataGrid tùy chỉnh tại đây.

Trong số DataGrid, liên kết ItemsSource với số ICollectionView. Bí quyết ở đây là đặt IsSynchronizedWithCurrentItem="True" có nghĩa là hàng đã chọn sẽ là mục hiện tại.

Phần thứ hai của mẹo là để ràng buộc CommandParameter với mục hiện tại bằng cú pháp dấu gạch chéo.

Khi một hàng được nhấp đúp, lệnh sẽ được thực thi với hàng được nhấp làm đối số.

<DataGrid 
    ItemsSource="{Binding CollectionView}" 
    IsSynchronizedWithCurrentItem="True"> 
    <DataGrid.InputBindings> 
     <MouseBinding 
      MouseAction="LeftDoubleClick" 
      Command="{Binding DoubleClickCommand}" 
      CommandParameter="{Binding CollectionView/}"/> 
    </DataGrid.InputBindings> 
</DataGrid> 

Đây là cách một (giản thể) phiên bản của mô hình xem sẽ nhìn:

class MyViewModel 
{ 
    public ICollectionView CollectionView { get; set; } 

    public ICommand DoubleClickCommand { get; set; } 
} 
+1

là '/' trong '{Binding CollectionView /}' có mục đích? – Maslow

+3

Có, điều đó làm cho nó liên kết với mục hiện tại. Khi được sử dụng với 'IsSynchronizedWithCurrentItem' có nghĩa là mục đã chọn. [Đây] (http://www.thejoyofcode.com/binding_to_the_current_item_in_wpf.aspx) một bài đăng blog. – Mizipzor

+1

Giải pháp rất gọn gàng. Cũng không biết về các ràng buộc cắt giảm về phía trước. Đôi khi tôi thực sự ngạc nhiên khi mọi người biết những điều này từ đó. Cảm ơn bạn! – McLovin