1

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 を使用している場合、ビジネス コードは Module プロジェクト内にあり、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);

「通常の」MVVM Light Application には 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

4

2 に答える 2

0

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 であり、その中に別のものを作成するためです。ここでは Locator リソースにアクセスできません:

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

もう 1 つのオプションは、MergedDictionary を使用することです。

于 2012-01-15T23:10:57.687 に答える
0

ごめんなさい。私は大きな間違いを犯しました。お気づきかもしれませんが、私はリボン アプリケーションを構築しており、空白の領域の下にコントロールを表示しようとしています。そこに表示できる項目がコントロールです。ウィンドウを表示しようとしていたため、機能していませんでした:

<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はまだ同じです。

于 2012-01-16T13:36:40.870 に答える