2011-12-29 14 views
7

Estoy tratando de crear un conjunto de formularios de mantenimiento CRUD típicos en WPF, que serán prácticamente iguales, excepto que funcionan en diferentes registros de bases de datos.Seleccionar el control del usuario según el tipo de DataContext

En lugar de crear una nueva clase de ventana para cada una, intento usar una sola clase de ventana que crea una instancia con una clase ViewModel diferente para cada tabla de base de datos, y para la cual tengo definido un UserControl diferente para cada ViewModel.

Así que, si instalo la ventana con su DataContext configurado en una instancia de Record1ViewModel, quiero mostrarlo en la ventana usando un Record1UserControl, si está configurado en una instancia de Record2ViewModel, quiero mostrarlo usando un Record2UserControl .

He verificado que ambos controles funcionan bien, definiéndolos cada uno directamente en el XAML de la ventana. Pero no he descubierto cómo seleccionar uno u otro, según el tipo de ViewModel.

Esto no está funcionando:

<myWindow.Resources> 

    <DataTemplate x:Key="{x:Type ViewModels:Record1ViewModel}"> 
     <MaintenanceControls:Record1 /> 
    </DataTemplate> 
    <DataTemplate x:Key="{x:Type ViewModels:Record2ViewModel}"> 
     <MaintenanceControls:Record1 /> 
    </DataTemplate> 

</myWindow.Resources> 

<ContentPresenter Content="{Binding}" /> 

Lo que obtengo, en el ContentPresenter, es el nombre del tipo. Las plantillas de datos no se utilizan.

¿Alguna idea?

+0

En realidad, esto funciona, si uso

Respuesta

4

Puede utilizar el DataTemplateSelector para seleccionar dinámicamente un DataTemplate en tiempo de ejecución algo en la línea de

public class TaskListDataTemplateSelector : DataTemplateSelector 
    { 
     public override DataTemplate 
      SelectTemplate(object item, DependencyObject container) 
     { 
      FrameworkElement element = container as FrameworkElement; 

      if (element != null && item != null && item is Task) 
      { 
       Task taskitem = item as Task; 

       if (taskitem.Priority == 1) 
        return 
         element.FindResource("importantTaskTemplate") as DataTemplate; 
       else 
        return 
         element.FindResource("myTaskTemplate") as DataTemplate; 
      } 

      return null; 
     } 
    } 
+0

El uso de DataTemplates en el xaml parece funcionar, una vez que uso los atributos correctos, pero parece que usar un DataTemplateSelector me permitiría elegir la plantilla en el código. –

Cuestiones relacionadas