Пример приложения Catel PersonApplication

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

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

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

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

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

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

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


person Wayne McKittrick    schedule 06.12.2016    source источник


Ответы (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);
}
person Julio Nobre    schedule 06.12.2016
comment
Очень хороший. Это сработало. Интересно, почему Герт не исправляет этот код. Хотя Catel действительно впечатлил. Но это довольно стальная кривая обучения - все же оно того стоит, учитывая его возможности. Спасибо, Хулио. - person Wayne McKittrick; 07.12.2016

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

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

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

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

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

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

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

person Geert van Horrik    schedule 07.12.2016