Каково стандартное соглашение для определения вложенного представления: отображение модели представления в MVVM Light

поэтому в классических примерах 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? как насчет коллекций моделей представлений?


person Firoso    schedule 18.04.2010    source источник
comment
Я понимаю, что одной из больших проблем с MVVM является ОТСУТСТВИЕ единой методологии.   -  person Firoso    schedule 18.04.2010
comment
Я не думаю, что это проблема MVVM как такового. Это шаблон с несколькими реализациями. То же самое с MVC или другими. Я не считаю это проблемой, это действительно зависит от ситуации и проблемы, которую вы пытаетесь решить.   -  person LBugnion    schedule 19.04.2010
comment
У меня очень похожие вопросы. Итак, DataTemplates достаточно хороши для WPF? Я хочу что-то вроде областей Prism, но без Prism.   -  person nportelli    schedule 22.07.2010


Ответы (1)


Используемый вами метод (с неявно типизированными 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, и я хочу предложить гораздо более универсальное решение в следующей версии.

person LBugnion    schedule 18.04.2010