Каково стандартное соглашение для определения вложенного представления: отображение модели представления в MVVM Light - PullRequest
5 голосов
/ 18 апреля 2010

Итак, в классических примерах MVVM, которые я видел, определения DataTemplate используются для сопоставления моделей представлений с представлениями, каков стандартный способ сделать это в среде MVVM Light и где должны располагаться сопоставления? Ниже приведены примеры того, что я делаю сейчас и о чем я говорю, для меня важна смешиваемость!

Главное окно:

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
        mc:Ignorable="d" 
        x:Class="STS2Editor.MainWindow"
        Title="{Binding ApplicationTitle, Mode=OneWay}"
        DataContext="{Binding RootViewModel, Source={StaticResource Locator}}">
    <Window.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Skins/ApplicationSkin.xaml" />
                <ResourceDictionary Source="Resources/ViewMappings.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Window.Resources>
    <Grid>
        <ContentControl Content="{Binding ApplicationManagementViewModel}" HorizontalAlignment="Left" VerticalAlignment="Top"/>
    </Grid> 
</Window>

В приведенном выше коде мой класс RootViewModel имеет экземпляр класса ApplicationManagementViewModel с тем же именем свойства:

public ApplicationManagementViewModel ApplicationManagementViewModel {get {...} set {...} }

Я ссылаюсь на ResourceDictionary "ViewMappings.xaml", чтобы указать, как моя модель представления представляется как представление.

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:local="clr-namespace:STS2Editor.ViewModel">
    <DataTemplate DataType="{x:Type local:ApplicationManagementViewModel}">
        <local:ApplicationManagementView/>
    </DataTemplate>
</ResourceDictionary>

я должен делать такие вещи, используя ViewModelLocator? А как насчет коллекций моделей представлений?

1 Ответ

4 голосов
/ 18 апреля 2010

Используемый вами метод (с неявно типизированными DataTemplates) работает нормально в WPF, но, к сожалению, он не работает в Silverlight. Это одна из причин, почему я предпочитаю использовать более явный метод, который работает в обоих мирах.

Кроме того, неявно типизированные DataTemplates могут немного сбивать с толку, поскольку не всегда понятно, откуда берется шаблон. Это может иногда усложнять работу интегратора, особенно для небольших изменений пользовательского интерфейса (было сделано, сделано это:)

Нет необходимости использовать ViewModelLocator в MVVM Light, это просто способ, который работает хорошо и довольно легко понять (для людей, читающих код, которые не знакомы с тонкостями WPF / SL). В конце концов, это вопрос предпочтений, но в последнее время популярность шаблона ViewModelLocator, похоже, растет (см., Например, этот пост, где универсальный ViewModelLocator используется вместе с MEF).

http://www.johnpapa.net/simple-viewmodel-locator-for-mvvm-the-patients-have-left-the-asylum/

Наконец, позвольте мне добавить, что меня не очень устраивает текущая реализация ViewModelLocator в MVVM Light, и я хочу предложить гораздо более общее решение в следующей версии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...