Призма и MVVM Light Toolkit - PullRequest
       63

Призма и MVVM Light Toolkit

1 голос
/ 14 января 2012

Я пытаюсь совместить Prism (только для CompositeUI) и MVVM Light Toolkit (для архитектуры MVVM = D), но у меня возникают некоторые проблемы с Light ViewModelLocator.Когда мы используем локатор в «простом» приложении WPF, мы можем использовать ресурс приложения в App.xaml, например:

<Application.Resources>
    <vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" />
</Application.Resources>

Но когда мы используем Prism, наш бизнес-код находится внутри модуля.проект, и у него нет App.xaml, затем я попытался поместить этот ресурс в ресурсы View:

<Window.Resources>
    <ResourceDictionary>
        <vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" />
    </ResourceDictionary>
</Window.Resources>

Он просто отключил мои ошибки режима разработки (и также времени выполнения), ноПредставление не отображается в назначенном ему регионе.

Кто-то уже пытался сделать что-то подобное?Можно ли заставить Prism и MVVM Light работать вместе?

Это мой "полный" код:

(ViewLight.xaml)

<Window x:Class="TryERP2.Financeiro.View.ViewLight"
    ... a lot of NS ...
    mc:Ignorable="d"
    xmlns:vm="clr-namespace:TryERP2.Financeiro.ViewModel"
    d:DesignHeight="150" d:DesignWidth="245" SizeToContent="WidthAndHeight">
    <Window.Resources>
        <ResourceDictionary>
            <vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" />
        </ResourceDictionary>
    </Window.Resources>

    <Grid DataContext="{Binding Light, Source={StaticResource Locator}}">
        <Button Content="{Binding MyButtonText}" HorizontalAlignment="Stretch" Name="button1" VerticalAlignment="Stretch" />
    </Grid>
</Window>

ViewLightModel.cs:

public class ViewLightModel : ViewModelBase
{
    public ViewLightModel()
    { }

    public const string MyButtonTextPropertyName = "MyButtonText";
    private string _myButtonText = "Button Text";

    public string MyButtonText
    {
        get
        { return _myButtonText; }

        set
        {
            if (_myButtonText == value)
            { return; }

            _myButtonText = value;
            RaisePropertyChanged(MyButtonTextPropertyName);
        }
    }
}

Financeiro.cs (Класс инициализатора модуля ... Частично показан ... Как раз там, где я регистрируюсь и "запускаю" представления):

        var container = ServiceLocator.Current.GetInstance<IUnityContainer>();
        container.RegisterType<Object, ViewLight>("ViewLight");

        var regionManager = ServiceLocator.Current.GetInstance<IRegionManager>();
        var main = new Uri("ViewLight", UriKind.Relative);
        regionManager.RequestNavigate("Desktop", main);

A "нормальный"Приложение MVVM Light содержит файл App.xaml, который (я думаю) не используется в представлениях модулей Prism.Этот файл имеет следующую структуру:

<Application x:Class="TryERP2.Financeiro.App"
         ... a lot of NS ...
         xmlns:vm="clr-namespace:TryERP2.Financeiro.ViewModel"
         StartupUri="MainWindow.xaml"
         mc:Ignorable="d">

    <Application.Resources>
        <vm:ViewModelLocator x:Key="Locator"
                             d:IsDataSource="True" />
    </Application.Resources>

</Application>

Вот что происходит, когда я выполняю свое приложение.Представление, которое было на модуле, должно быть загружено в это пустое пространство, показывая его кнопку, но ничего не произошло:

http://imageshack.us/photo/my-images/818/capturarwy.png

Когда я пытаюсь изменить это представление и поставить на его место«простой вид» (без использования MVVMLight), он работает отлично, как показано на рисунке ниже:

http://imageshack.us/photo/my-images/513/capturar1a.png

Ответы [ 2 ]

0 голосов
/ 16 января 2012

Извините.Я сделал большую ошибку.Как вы, возможно, заметили, я создаю приложение на ленте и пытаюсь показать элементы управления в пустой области.Элементы, которые могут отображаться там, являются элементами управления.Это не сработало, потому что я пытался отобразить окно:

<Window x:Class="TryERP2.Financeiro.View.ViewLight"
... a lot of NS ...
mc:Ignorable="d"
xmlns:vm="clr-namespace:TryERP2.Financeiro.ViewModel"
d:DesignHeight="150" d:DesignWidth="245" SizeToContent="WidthAndHeight">
... etc

Я исправил его, изменив его на пользовательский элемент управления вместо окна, и он работал отлично.

Мой новыйViewLight.xaml:

<UserControl x:Class="TryERP2.Financeiro.View.ViewLight"
        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"
        xmlns:vm="clr-namespace:TryERP2.Financeiro.ViewModel"

        d:DesignHeight="150" d:DesignWidth="245">
    <UserControl.Resources>
        <vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" />
    </UserControl.Resources>

    <Grid DataContext="{Binding Light, Source={StaticResource Locator}}">
        <Button Content="{Binding MyButtonText}" HorizontalAlignment="Stretch" Name="button1" VerticalAlignment="Stretch" />
    </Grid>
</UserControl>

Мой новый ViewLight.xaml.cs (с выделенным кодом):

public partial class ViewLight : UserControl
{
    public ViewLight()
    {
        InitializeComponent();
    }
}

И ViewModel остается прежней.

0 голосов
/ 16 января 2012

В ViewLight.xaml вы должны изменить

<Window.Resources>
    <ResourceDictionary>
        <vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" />
    </ResourceDictionary>
</Window.Resources>

на

<Window.Resources>
        <vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" />
</Window.Resources>

Поскольку Window.Resources уже является ResourceDictionary, и вы создаете в нем другое.Вы не можете получить доступ к ресурсу локатора здесь:

<Grid DataContext="{Binding Light, Source={StaticResource Locator}}">

Другой вариант - использовать MergedDictionary.

...