2012-01-14 18 views
1

私はPrism(CompositeUIの場合のみ)とMVVM Light Toolkit(MVVMアーキテクチャの場合= D)を連携させようとしていますが、Light ViewModelLocatorにいくつか問題があります。 私たちは「シンプル」WPFアプリケーションにロケータを使用する場合、我々はこのように、App.xaml上のアプリケーションのリソースを使用することができます。PrismとMVVM Light Toolkit

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

をしかし、我々はプリズムを使用しているとき、私たちのビジネスのコードでは、モジュールプロジェクト内にあります、そしてそれは私がビューリソース内でそのリソースを入れてみました、その後、App.xamlを持っていない:それはちょうど私のデザインモード(と、ランタイム)エラーをオフに

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

が、ビューは」doesnのそれに割り当てられた領域には表示されません。

誰かがすでにこのようなことを試みましたか? 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アプリケーションには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を使用していないことは、完璧に動作します:ViewLight.xamlで

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

+0

どのコンテナを使用しますか? MEFかUnity?ビューコードビハインドとViewModelコードビヘイビアのコードを投稿できますか?また、V-VMをどのように領域に注入するかを記述します。 MVVMLight、デザインデータなどは、PRISM/Silverlightで扱う別の問題です。表示されていない表示が最も可能性が高い合成エラー – katit

+0

Unityを使用しています。質問を編集してコード全体を投稿します。 –

+0

デフォルトのコードを除いて、ビューにコードビハインドはありません。 実行中のアプリケーションの説明されたスクリーンショットが参考になると思いますか? –

答えて

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

0

あなたは

<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}}"> 

また、MergedDictionaryを使用することもできます。

+0

こんにちは...私はすでにタグを削除しようとしましたが、これは効果がありませんでした。バインディングに関しては、エラーが発生したので、タグに変更しました。 DataContextプロパティの元の場所はタグでした。 –

+0

Windowタグに入っていたときに、「Locatorという名前のリソースが見つかりません。リソース名では大文字と小文字が区別されます。これは、リソースがタグ内にある単純なMvvmLightアプリケーションで動作していました。 –

+0

どのようなエラーがありましたか? vs(デバッグモードで)の出力をチェックして、バインディングエラーをキャプチャします。 –

関連する問題