2011-10-21 19 views
7

Mam aplikację z kilkoma datagrids i eksportować do excel polecenia, który dostaje skoncentrowany datagrid jako parametr polecenia. Czy można powiązać CommandParameter z FocusManager.FocusedElement, czy muszę ustawić je explicity?Wiązanie z FocusManager.FocusedElement

góry dzięki

Odpowiedz

7

Tak, można powiązać z FocusedElement. Coś jak:

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

W zależności od zakresu ostrości, może być konieczna zmiana Okna na inny element.

Ale osobiście skonfigurowałbym program obsługi polecenia, aby sprawdzić, czy parametr ma wartość null. Jeśli tak, to programowo otrzymam FocusManager.FocusedElement.

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

Można również przeszukać drzewo wizualne zgodnie z potrzebami, aby uzyskać powiązaną DataGrid.

+0

+1 dla podejścia XAML. Ale jeśli chodzi o część kodu, jeśli podążam za wzorcem MVVM i moje polecenie znajduje się w moim ViewModelu, nie powinienem uzyskiwać dostępu do moich obiektów interfejsu użytkownika. Dobrze? –

+1

@ RV1987- Jeśli przekazujesz go za pomocą parametru CommandParameter, nadal uzyskujesz dostęp do obiektu interfejsu użytkownika :) – CodeNaked

+0

Podejście Xaml nie działa dla mnie, ale może być problem z Fluent Ribbon, którego używam. Kod działający za podejściem działa, ale musisz użyć funkcji GetFocusedElement i przekazać jej odniesienie do głównego okna – Twelve

1

Dlaczego nie można mieć właściwość CLR na swoim ViewModel powiedzieć "SelectedDataGrid" której aktualizacje gdy dowolnych DataGrid uzyskuje fokus. Po prostu używaj tej właściwości w kodzie, zamiast przekazywać ją z widoku.

+0

Używam pryzmatu i mam kilka modułów, więc musiałbym dodać tę właściwość do każdego modelu podglądu, co oczywiście nie jest najlepszym pomysłem – Twelve