¿Cómo puedo enlazar un control WPF del contenido a su contenedor DataContext para que yo pueda aplicar un DataTemplateSelector basa en que el objeto?
-
15-11-2019 - |
Pregunta
Estoy tratando de enlazar una ventana WPF en la cima de una Perspective que contiene dos conjuntos, a y B.Estoy intentando utilizar DataTemplates para mostrar ya sea a o B, dependiendo de la configuración de una bandera en mi ViewModel.
A tal fin, he conjunto de la ventana DataContext = ViewModel
.Sin embargo, cuando intento enlazar un ContentControl
para que DataContext y aplicar un DataTemplateSelector
para él, la item
parámetro del selector SelectTemplate(object item, DependencyObject container)
el método es siempre null:
<Window [snip] Title="MainWindow">
<Window.Resources>
<!-- DataTemplate and Selector declarations -->
</Window.Resources>
<Grid>
<ContentControl Content="{Binding}"
ContentTemplateSelector="{StaticResource templateSelector}" />
</Grid>
</Window>
Cómo debería ser vinculante que ContentControl
tal que la Ventana Perspective pasarán a través de su DataTemplateSelector
?
Solución
esto funcionó para mí:
<ContentControl Content="{Binding DataContext, RelativeSource={RelativeSource Self}}"
ContentTemplateSelector="{StaticResource templateSelector}" />
Editar:
Estoy de acuerdo con Aarón, sin embargo, que esto podría no ser la mejor manera de lograr las cosas.Usted dijo que usted está usando un ViewModel.La manera más fácil sería obligar a su ItemsControl a un nuevo "SelectedCollection" de la propiedad en el Viewmodel que expone la quería colección.A continuación, en su bandera (suponiendo que se trata de una propiedad) puede disparar propertychanged para "SelectedCollection".
Otros consejos
Un montón de cosas que están pasando aquí...
Usted dijo que usted es el uso de la DataTemplateSelector
para mostrar la colección de Una o de la colección de B, mientras que, al mismo tiempo, usted ha declarado que son la creación de una de las colecciones como la DataContext
de la Ventana.
Si desea ocultar los datos en una colección de realizar el filtrado de la colección en sí.Otro enfoque es el de ejecutar la unión a través de un IValueConverter
o IMultiValueConverter
.Sin embargo, otra solución podría ser tener dos elementos de interfaz de usuario enlazado a cada colección, respectivamente, y cambiar el Visiblity
el elemento de interfaz de usuario basado en el valor en su ViewModel.
Un montón de opciones diferentes...y si he entendido correctamente la DataTemplateSelector
no debe ser uno de ellos.