Catel PersonApplication пример

В настоящее время изучаю Catel.

В PersonApplication Catel.Examples, в частности, PersonWindow.xaml: данные времени разработки не отображаются в Visual Studio Designer.

В коде PersonViewModel открытые свойства закомментированы. Очевидно, это связано с тем, что код использует Fody для создания свойств модели во время выполнения. Итак, я раскомментировал общедоступные свойства, предполагая, что для Visual Studio Designer требуются общедоступные свойства для отображения данных времени разработки в Designer. Тем не менее, данные времени разработки DesignPersonViewModel не отображаются в конструкторе.

Приложение работает правильно во время выполнения. В Building нет сообщений, указывающих на проблему в XAML или коде. Код XAML, объявляющий текстовый код времени разработки, является правильным:

d:DataContext="{d:DesignInstance ViewModels:DesignPersonViewModel,
                                 IsDesignTimeCreatable=True}"

Любое объяснение, почему данные времени проектирования не отображаются в Designer?

Я использую Visual Studio 2015.

2 ответа

Тем не менее, моя сильная признательность за рамки Catel, я также был свидетелем этого странного поведения

Кажется, что свойства зависимостей не связаны с декорированным свойством [Model]. Однако, хотя это должно быть исправлено, вы можете напрямую обойти настройку свойств зависимостей.

public PersonViewModel(Person person) // this approach works
{
    // Person = person ?? new Person();
    // The following 2 lines provide DesignTime data
    SetValue("FirstName", "Joe");
    SetValue("LastName", "Dalton");
    GenerateData = new Command<object, object>(OnGenerateDataExecute, OnGenerateDataCanExecute);
    ToggleCustomError = new Command<object>(OnToggleCustomErrorExecute);
}

public PersonViewModel(Person person) // this approach does not work
{
    // Person = person ?? new Person();
    Person = new Person() { FirstName = "Joe", LastName = "Dalton" };
    GenerateData = new Command<object, object>(OnGenerateDataExecute, OnGenerateDataCanExecute);
    ToggleCustomError = new Command<object>(OnToggleCustomErrorExecute);
}

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

Модели представления времени разработки должны быть очень легкими и простыми, чтобы показывать некоторые фиктивные данные в конструкторе. Они не должны вести себя как полнофункциональные модели представления во время выполнения, потому что это замедлит работу дизайнера и может привести к его аварийному завершению в случае исключений.

Вдобавок ко всему, мы даже проверяем, работаем ли мы в дизайнере, и пропускаем довольно логику, если так.

Таким образом, хотя это выглядит как ошибка, это сделано из-за того, что модели представления времени разработки должны быть простыми и легкими. Мы предлагаем, чтобы в целях дизайна вы создали очень простое и добавили дополнительное соглашение об именах в ViewModelLocator. Например:

if (CatelEnvironment.IsInDesignMode)
{
    var viewModelLocator = ServiceLocator.Default.ResolveType<IViewModelLocator>();
    viewModelLocator.NamingConventions.Insert(0, "[UP].ViewModels.[VW]DesignTimeViewModel")
}

Это позволит вашему приложению предпочесть MyPersonDesignTimeViewModel в режиме разработки, но все равно будет загружать фактические модели представлений при запуске приложения.

Обратите внимание, что это работает только в том случае, если представления будут на самом деле пытаться разрешить модели представлений во время разработки, я не знаю этого из головы, потому что я никогда не использую время разработки.

Другие вопросы по тегам