2011-10-21 12 views
7

Tengo una aplicación con varias cuadrículas de datos y exportación al comando excel, que se centra en la cuadrícula de datos como un parámetro de comando. ¿Es posible enlazar CommandParameter a FocusManager.FocusedElement, o tengo que configurar explícitamente?Encuadernación a FocusManager.FocusedElement

Gracias de antemano

Respuesta

7

Sí, puede enlazar a FocusedElement. Algo como:

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

Dependiendo de sus ámbitos de enfoque, puede necesitar cambiar la Ventana a otro elemento.

Pero personalmente, configuré el controlador del comando para ver si el parámetro es nulo. Si es así, obtendría programáticamente el FocusManager.FocusedElement.

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

También puede buscar el árbol visual según sea necesario para obtener el DataGrid asociado.

+0

+1 para el enfoque xaml. Pero para la parte de código, si estoy siguiendo el patrón de MVVM y mi comando reside en mi ViewModel, no debería acceder a los objetos de mi UI desde allí. ¿Derecha? –

+1

@ RV1987- Si pasa a través de CommandParameter todavía está accediendo al objeto UI :) – CodeNaked

+0

El enfoque Xaml no funciona para mí, pero puede ser un problema con Fluent Ribbon que uso. El código detrás del enfoque funciona, pero debe usar la función GetFocusedElement y pasarla a la ventana principal – Twelve

1

Por qué no puedes tener la propiedad de CLR en sus ViewModel decir "SelectedDataGrid" cual usted actualizaciones cada vez que cualquiera de su cuadrícula de datos obtiene foco. Simplemente use esa propiedad en su código, en lugar de pasarla de su Vista.

+0

Uso el prisma y tengo varios módulos, así que tendría que agregar esta propiedad a cada modelo de vista, que por supuesto no es la mejor idea – Twelve