Originally my .xaml form used the following line to set the Designer's DataContext where the view model was a non-generic type (note I'm talking about the Design time DataContext not the actual DataContext that will be used at runtime).
<Window ...
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
d:DataContext="{d:DesignInstance Dialogs:CustomerSearchDlogViewModel}"
...>
Now instead of CustomerSearchDlogViewModel I have a generic SearchDialogViewModel but I can't figure out what syntax will work in the <Window> tag to let me specify that view model.
That is not possible unless the markup extension (DesignInstance
) provides properties to pass type arguments, which i doubt. So you might want to subclass as suggested or write your own markup extension which creates generic instances (in fact that is what i am doing right now).
Edit: This extension should do it:
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);
}
}
Initially i had some problems getting the object type from a type-name but you can let the XAML parser resolve the type for you which is neat:
DataContext="{me:GenericObjectFactory Type={x:Type Dialogs:CustomerSearchDlogViewModel`1},
T=Data:Customer}"
(Note the `1
at the end to reference a generic type. If you drop the x:Type
wrapping the backtick will cause an error.)