2011-11-22 5 views
7

Originariamente il mio modulo .xaml utilizzava la seguente riga per impostare DataContext del Designer in cui il modello di visualizzazione era un tipo non generico (nota I'm talking circa il tempo di progettazione DataContext non il DataContext effettivo che verrà utilizzato in fase di esecuzione).Come impostare il DataContext Design di WPF form xaml sulla classe che utilizza parametri di tipo generico

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

Ora, invece di CustomerSearchDlogViewModel ho un SearchDialogViewModel generico, ma non riesco a capire che cosa la sintassi funzionerà nel tag <finestra> per farmi Preciso che modello di vista.

risposta

11

Ciò è possibile solo se l'estensione di markup (DesignInstance) fornisce le proprietà di passare argomenti di tipo, di cui dubito. Quindi potresti voler creare sottoclasse come suggerito o scrivere la tua estensione di markup che crea istanze generiche (in effetti è quello che sto facendo al momento).

Edit: Questa estensione dovrebbe farlo:

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); 
    } 
} 

Inizialmente ho avuto qualche difficoltà a trovare il tipo di oggetto da un nome-tipo, ma si può lasciare che il parser XAML risolvere il tipo per voi che è pulito :

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

(si noti la `1 alla fine per fare riferimento a un tipo generico Se si lascia cadere la x:Type avvolgendo l'apice inverso causerà un errore..)

+0

Non so come fare quest'ultimo, quindi se lo fai e scrivi un blog o qualsiasi cosa possa aiutarti, sarei un avido lettore. – Tod

+0

@Tod: è un grande dolore, richiede molta riflessione e sono un po 'bloccato, se qualcosa proviene da esso, modificherò la mia risposta e te lo dirò. –

+0

@Tod: Penso di aver trovato un modo, dopo tutto. –

1

Un'opzione pulito sarebbe quella di creare un nuovo tipo che solo appiattisce il tipo generico:

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

Dal momento che ho già un CustomerSearchDialogViewModel, sarà semplice e semplice cancellarne il contenuto e ridefinirlo come suggerito (invece di eliminarlo). Non ci ho pensato, è sempre bello scoprire cosa non si può fare. – Tod

Problemi correlati