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 を使用しない) を配置しようとすると、下の図に示すように完全に機能します。