2015-12-14 2 views
0

В привязке модели WPF можно было бы сделать, разместив DataTemplate с видами и видами вида в вашем приложении.xaml. Затем вы можете просто привязать viewmodel к contentpresenter, и ваше представление изменится, если вы измените модель своего представления на какое-то событие.ViewModel-View Binding в универсальных приложениях Windows

Вот старый код:

App.xaml (AView и BView просто пользовательские элементы управления)

<Application.Resources> 
    <DataTemplate DataType="{x:Type viewModels:AViewModel}"> 
     <views:ViewA/> 
    </DataTemplate> 
    <DataTemplate DataType="{x:Type viewModels:BViewModel}"> 
     <views:ViewB/> 
    </DataTemplate> 
</Application.Resources> 

Тогда на какой-то точки зрения ребенка, который содержал текущий контекст:

<ContentPresenter Content="{Binding CurrentViewModel}" /> 

(много как https://stackoverflow.com/a/22376718/82333)

Однако синтаксис данных отсутствует lon ger работает. Я прочитал x: bind, но выполнение базовой замены типа viewmodel не исправляет его.

Используя этот синтаксис:

<Application.Resources> 
    <DataTemplate x:Key="ViewAKey" x:DataType="viewModels:AViewModel"> 
     <views:ViewA/> 
    </DataTemplate> 
    <DataTemplate x:Key="ViewBKey" x:DataType="viewModels:BViewModel"> 
     <views:ViewB/> 
    </DataTemplate> 
</Application.Resources> 

Вызывает несколько ошибок:

Visual Studio жалуется, что вид модели не в пространствах имен я в комплект поставки.

XBF generation error code 0x09c4.

Каков эквивалентный синтаксис этой операции в Windows 10 Universal Apps?

+0

У меня было приложение Windows 8.1 wpf, которое работало, и я переместил код в универсальное приложение Windows 10, а 'Application.Resources' больше не было действительным, и я получал странные сообщения об ошибках. –

+0

Если нет DataTemplate, что является типом свойства ContentTemplate? – Maximus

ответ

3

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

В UWP x:DataType является свойством времени компиляции, вы не можете получить значение во время выполнения. x:DataType работает с {x:Bind}. При использовании x:DataType в Application.Resources он поднимет XBF generation error, поскольку компилятор не может сгенерировать код. {x:Bind} зависит от генерации кода, если вы используете {x: Bind} в ресурсном словаре, словарь ресурсов должен иметь класс кода. И затем вы можете повторно использовать словарь ресурсов, создавая экземпляр своего типа вместо ссылки на его имя файла. Для получения дополнительной информации о том, как использовать {x:Bind} в словаре ресурсов, см. Resource dictionaries with {x:Bind}.

Если нам нужно переключить DataTemplate на основе типа модели, нам необходимо использовать DataTemplateSelector class.

См. Аналогичный случай: How to associate view with viewmodel or multiple DataTemplates for ViewModel? для примера о том, как сопоставить тип данных и шаблон данных в UWP через DataTemplateSelector.

+0

Это кажется далеким от старого синтаксиса и гораздо более сложным - я попытался его реализовать и имел проблемы с аргументом элемента datatemplateselector, всегда возвращающим null. Я попробую еще раз позже и посмотрю, не пойду ли я где-нибудь еще, но до сих пор нет кубиков :( –