Silverlight 4 отсутствует, и кажется, что мы пропустили функциональность DataTemplate DataType в этом выпуске снова, который является довольно основным для поддержки MVVM, по моему скромному мнению. Для моих приложений WPF, в этой точке, я довольно привык к глобальному добавлению DataTemplates для моих Представлений к моему Приложению. Ресурсы с DataTypes для моего соответствующего ViewModels:
т.е.
<DataTemplate DataType="{x:Type viewModels:myViewModel}">
<views:myView/>
</DataTemplate>
Мне нравится этот подход, так как все мои связанные ViewModels автоматически отображают корректное содержание... особенно полезное, когда у меня есть некоторый ItemSource, по моему мнению, связанный с набором ViewModels... Это, например, автоматически удостоверится каждая вкладка в TabControl, связанном с a Collection<SomeViewModel>
отображает представление, связанное с SomeViewModel
.
Некоторые вещи, которые я попробовал за SL 3, включают:
Создание "DataTemplatePresenterContentControl", который автоматически применяет DataTemplate для Содержания, когда управление загрузилось
Используя TypeConverter, примененный динамично на загрузку управления, спускаясь с визуального дерева, ища данные, связал объекты
Используя стиль, примененный динамично на загрузку управления, спускаясь с визуального дерева, ища данные, связал объекты
Однако ни один из этих подходов действительно не обращается к ситуации, которую я упомянул выше приемлемым способом, который является действительно ключевым.
Так, так как это все еще не возможно из поля в Silverlight 4, я ценил бы, чтобы знать, придумал ли кто-либо все же некоторые разумные альтернативы.
Спасибо.
В WPF и Silverlight для этого я использую Prism. Я считаю, что гораздо более универсальным является переключение представлений на основе типов. Чтобы его пристегнуть, требуется немного, но как только он вставлен, возможности безграничны.
Edit
Я делаю это, привязывая RegionName к свойству в моей ViewModel (может быть GetType (). Name, если хотите). Затем я регистрирую типы имен, и все работает.
В случае чего-то вроде ListBox я установил шаблон данных следующим образом:
<ContentControl Regions:RegionManager.RegionName="{Binding SomeName}" />
Если вы не хотите, чтобы SomeName
было на объекте, к которому вы привязываетесь, рассмотрите ValueConverter который возвращает имя типа:
<ContentControl Regions:RegionManager.RegionName="{Binding SomeName, Converter={StaticResource ObjectToTypeConverter}}" />
Это поможет?