2011-11-22 7 views
7

Originalmente, mi formulario .xaml usó la siguiente línea para establecer el DataContext del diseñador donde el modelo de vista era un tipo no genérico (nota, estoy hablando sobre el tiempo de diseño DataContext no el DataContext real que se utilizará en tiempo de ejecución).Cómo configuro WPF xaml Design DataContext del formulario en la clase que usa los parámetros de tipo genérico

<Window ... 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"  
d:DataContext="{d:DesignInstance Dialogs:CustomerSearchDlogViewModel}" 
...> 

Ahora en lugar de CustomerSearchDlogViewModel Tengo un SearchDialogViewModel genérica, pero no puedo averiguar qué sintaxis trabajará en la etiqueta <Ventana> a Permitir especificar que vista del modelo.

Respuesta

11

Eso no es posible a menos que la extensión de marcado (DesignInstance) proporciona propiedades para pasar argumentos de tipo, cosa que dudo. Así que es posible que desee crear una subclase según lo sugerido o escribir su propia extensión de marcado que crea instancias genéricas (de hecho, eso es lo que estoy haciendo en este momento).

Editar: Esta extensión debe hacerlo:

public class GenericObjectFactoryExtension : MarkupExtension 
{ 
    public Type Type { get; set; } 
    public Type T { get; set; } 

    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     var genericType = Type.MakeGenericType(T); 
     return Activator.CreateInstance(genericType); 
    } 
} 

Inicialmente tuve algunos problemas para conseguir el tipo de objeto a partir de un nombre-tipo, pero puede dejar que el analizador XAML resolver el tipo para usted que está ordenada :

DataContext="{me:GenericObjectFactory Type={x:Type Dialogs:CustomerSearchDlogViewModel`1}, 
             T=Data:Customer}" 

(Nota del `1 al final para hacer referencia a un tipo genérico Si se le cae el x:Type envolviendo el acento grave, se producirá un error..)

+0

No sé cómo hacer esto último, así que si lo haces y escribes un blog o cualquier cosa que pueda ayudar, sería un ávido lector. – Tod

+0

@Tod: Es un gran dolor, requiere mucha reflexión y estoy un poco atascado, si algo sale de eso voy a editar mi respuesta y decirte. –

+0

@Tod: Creo que encontré una forma después de todo. –

1

Una opción limpia sería la creación de un nuevo tipo que acaba aplana el tipo genérico:

public class CustomerSearchDialogViewModel : SearchDialogViewModel<Customer> 
{ 
} 
+0

Dado que ya tengo un CustomerSearchDialogViewModel, será lindo y simple eliminar su contenido y redefinirlo como usted sugiere (en lugar de eliminarlo). No pensé en esto además, siempre es bueno averiguar qué no se puede hacer. – Tod

Cuestiones relacionadas