Как установить Design DataContext формы WPF xaml для класса, который использует параметры универсального типа - PullRequest
10 голосов
/ 23 ноября 2011

Первоначально моя форма .xaml использовала следующую строку, чтобы установить DataContext дизайнера, где модель представления была неуниверсальным типом (обратите внимание, я говорю о DataContext времени разработки, а не фактическом DataContext, который будет использоваться при выполнения) .

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

Теперь вместо CustomerSearchDlogViewModel у меня есть общий SearchDialogViewModel, но я не могу понять, какой синтаксис будет работать в теге , чтобы я мог указать эту модель представления.

Ответы [ 2 ]

18 голосов
/ 23 ноября 2011

Это невозможно, если расширение разметки (DesignInstance) не предоставляет свойства для передачи аргументов типа, в чем я сомневаюсь.Поэтому вы можете захотеть создать подкласс в соответствии с предложением или написать собственное расширение разметки, которое создает общие экземпляры (на самом деле это то, что я делаю прямо сейчас ).

Редактировать: Это расширение должно сделать это:

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

Изначально у меня были некоторые проблемы с получением типа объекта из имени типа, но вы можете позволить синтаксическому анализатору XAML определить тип, который вам подходит:

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

(Обратите внимание на `1 в конце, чтобы ссылаться на универсальный тип. Если вы уроните x:Type, оборачивающий обратную черту, вызовет ошибку.)

3 голосов
/ 23 ноября 2011

Чистым вариантом будет создание нового типа, который просто выравнивает универсальный тип:

public class CustomerSearchDialogViewModel : SearchDialogViewModel<Customer> 
{
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...