Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I set WPF xaml form's Design DataContext to class that uses generic type parameters

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.

like image 841
Tod Avatar asked Nov 22 '11 23:11

Tod


1 Answers

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.)

like image 191
H.B. Avatar answered Sep 18 '22 11:09

H.B.