2011-08-28 26 views
7

Tôi đang sử dụng một ItemsControl để hiển thị danh sách các mục dữ liệu, cho mỗi lõi của DataTemplate là một Lưới mà trên đó tôi đã đặt tất cả các điều khiển bị ràng buộc.Mục có thể nhấp Mục kiểm soát trong WPF

Tôi muốn có thể nhấp vào toàn bộ khu vực cho mỗi mục trong danh sách. Nhưng tôi không thể tìm ra cách làm cho khu vực có thể nhấp được.

Bất kỳ đề xuất nào về cách làm cho toàn bộ khu vực lưới có thể nhấp sẽ là tuyệt vời.

+0

những gì chính xác gây ra vấn đề này? Tôi đang cố gắng hiểu tại sao điều này xảy ra. Không phải là một nhấp chuột vào một mục kết quả trong một sự kiện chuột xem trước đường hầm xuống cây để treeviewitem? hoặc là treeviewitem không phải là trọng tâm của sự kiện chuột? Tôi nghĩ rằng các sự kiện chuột được nâng lên dựa trên thử nghiệm hit sẽ nhận được phần tử bên trong nhất trên cây thị giác (mà tôi giả định sẽ là treeviewitem) và sau đó làm cho mục tiêu của sự kiện –

Trả lời

4

Bạn có thể sử dụng AttachedCommandBehavior classes from C# Disciples để đạt được điều này.

Xác định lệnh trong ViewModel và sau đó trên đối tượng Lưới sử dụng ACB AttachedProperties để ràng buộc sự kiện MouseLeftButtonUp với lệnh.

Một số mã để giúp bạn bắt đầu:

 <Grid Name="grid" Height="30" ForceCursor="True" Cursor="Hand"> 
      <acb:CommandBehaviorCollection.Behaviors> 
       <acb:BehaviorBinding Event="MouseLeftButtonUp" Command="{Binding Path=DataContext.EditEventCommand, RelativeSource={RelativeSource AncestorType={x:Type self:Dashboard}}}" CommandParameter="{Binding}" /> 
      </acb:CommandBehaviorCollection.Behaviors> 
     </Grid> 

Chỉnh sửa cho giải pháp phi MVVM.

Đoạn mã trên sẽ vẫn hoạt động khi bạn chưa thiết kế ứng dụng của mình theo hướng dẫn MVVM khi bạn chủ yếu chỉ liên kết với lệnh trong mã sau.

Tuy nhiên, nếu bạn không muốn đi đến những rắc rối của việc xác định các lệnh, bạn có thể chỉ cần xác định một sự kiện để treo đến, như vậy:

<Grid MouseLeftButtonUp="Grid_MouseLeftButtonUp"> trong file XAML.

và trong code-behind:

private void Grid_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
    { 
    }   
+0

Điều đó vẫn hoạt động nếu tôi không sử dụng MVVM? (Thành thực mà không biết làm cách nào ...) –

+0

Có, điều này sẽ vẫn hoạt động khi không sử dụng MVVM - nhưng tôi đã cập nhật câu trả lời của mình với một số mã bổ sung. Lưu ý rằng thao tác này sẽ kích hoạt trên MouseUp chứ không phải Nhấp chuột. Nếu bạn muốn kích hoạt khi nhấp, bạn sẽ cần chụp cả hai sự kiện MouseDown và Up, bắt đầu hẹn giờ để đo thời gian được thực hiện giữa mỗi lần kích hoạt và sau đó kích hoạt cho phù hợp. – fatty

14

Để làm một cái gì đó có thể click bạn thường có thể bọc nó trong một Button, nếu nó cần được "vô hình" bạn có thể thay đổi mẫu:

<Button.Template> 
    <ControlTemplate TargetType="{x:Type Button}"> 
     <ContentPresenter /> 
    </ControlTemplate> 
</Button.Template> 
+1

+1: Đối với cuộc sống của tôi, tôi không thể tin rằng trong một bốn năm tôi đã viết trong XAML tôi chưa bao giờ nghĩ đến việc đó. – fatty

+0

@fatty: Oh wow; Tôi không thể tin rằng hầu hết các điều khiển có tất cả các loại sự kiện chuột nhưng không phải là một cú nhấp chuột đơn giản, có thể họ nghĩ rằng nút này sẽ vô dụng vì mọi thứ có thể được tạo kiểu giống như mọi người ([đây sẽ là câu hỏi liên quan đến tôi] (http://stackoverflow.com/questions/4830164/what-is-the-best-way-to-simulate-a-click-with-mouseup-mousedown-events-or-other)) –

+0

Đẹp nhất, thật điên rồ để suy nghĩ về việc bạn bị mắc kẹt trong lịch sử của mình như thế nào khi bạn làm điều tương tự lặp đi lặp lại. Không thể chờ đợi cho đến khi tôi có thể nhận được một kết nối net 'phong nha từ dưới tảng đá này tôi dường như đang sống dưới. – fatty

Các vấn đề liên quan