2016-12-06 6 views
2

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

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

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

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

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

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

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

ответ

1

Тем не менее моя сильная оценка на рамках Кателя, я также наблюдал это странное поведение

кажется, что свойства зависимостей не подключены к [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); 
} 
+1

Очень хорошо. Это сработало. Интересно, почему Geert не исправляет этот код. Хотя это действительно впечатлило Кател. Но, это довольно стальная кривая обучения - по-прежнему стоит того, что она обладает возможностями. Спасибо, Хулио. –

1

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

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

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

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

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

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

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