2011-10-21 26 views
7

Tôi có ứng dụng với một vài datagrids và xuất ra lệnh excel, được lấy dữ liệu tập trung làm tham số lệnh. Có thể liên kết CommandParameter với FocusManager.FocusedElement hoặc tôi có phải đặt chúng là explicity không?Liên kết với FocusManager.FocusedElement

Cảm ơn trước

Trả lời

7

Có, bạn có thể liên kết với FocusedElement. Một cái gì đó như:

<Button ... 
    CommandParameter="{Binding (FocusManager.FocusedElement), RelativeSource={RelativeSource AncestorType={x:Type Window}}}" /> 

Tùy thuộc vào phạm vi tiêu cự của bạn, bạn có thể cần phải thay đổi Cửa sổ thành phần tử khác.

Nhưng cá nhân, tôi sẽ thiết lập trình xử lý lệnh để xem tham số có rỗng không. Nếu đó là sau đó tôi lập trình có được FocusManager.FocusedElement.

var element = parameter as DataGrid; 
if (element == null) 
    element = FocusManager.FocusedElement as DataGrid. 

Bạn cũng có thể tìm kiếm cây thị giác khi cần để lấy DataGrid được liên kết.

+0

+1 cho phương pháp tiếp cận xaml. Nhưng đối với phần mã, nếu tôi đang theo mẫu MVVM và lệnh của tôi nằm trong ViewModel của tôi, tôi không nên truy cập các đối tượng UI của tôi từ đó. Đúng? –

+1

@ RV1987- Nếu bạn vượt qua nó thông qua CommandParameter bạn vẫn đang truy cập vào đối tượng UI :) – CodeNaked

+0

Cách tiếp cận Xaml không hiệu quả đối với tôi, nhưng nó có thể là vấn đề với Fluent Ribbon mà tôi sử dụng. Mã sau cách tiếp cận hoạt động, nhưng bạn phải sử dụng hàm GetFocusedElement và chuyển nó tham chiếu đến cửa sổ chính – Twelve

1

Tại sao bạn không thể có tài sản CLR trên ViewModel của bạn nói "SelectedDataGrid" mà bạn cập nhật bất cứ khi nào bất kỳ DataGrid của bạn được Focus. Chỉ cần sử dụng thuộc tính đó trong mã của bạn, thay vì chuyển nó từ Chế độ xem của bạn.

+0

Tôi sử dụng lăng kính và có nhiều mô-đun, vì vậy tôi phải thêm thuộc tính này vào mọi chế độ xem, tất nhiên không phải là ý tưởng hay nhất – Twelve