2009-07-23 10 views
13

...コンポジットWPF(プリズム)モジュールのリソースデータテンプレート

コマンドを受信すると、モジュールは、新たに作成し、 ViewModelを開き、リージョンマネージャーを使用してリージョンに追加します。

var viewModel = _container.Resolve<IMyViewModel>(); 
_regionManager.Regions[RegionNames.ShellMainRegion].Add(viewModel); 

私は、モジュール内のリソースの辞書を作成し、(XAML下記参照)にロードされたビューモデルタイプのビューを表示するには、データテンプレートを設定することができると考えました。しかし、ビューモデルがビューに追加されると、ビューモデルネームスペースが表示されます。

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:vm="clr-namespace:Modules.Module1.ViewModels" 
    xmlns:vw="clr-namespace:Modules.Module1.Views" 
> 
    <DataTemplate DataType="{x:Type vm:MyViewModel}"> 
     <vw:MyView /> 
    </DataTemplate> 
</ResourceDictionary> 

編集:

私はそれは、アプリの罰金ですが、それは、新しいモジュールが作成されることを意味しApp.xaml

<Application.Resources> 
    <ResourceDictionary.MergedDictionaries> 
     <ResourceDictionary Source="pack://application:,,,/Module1;component/Module1Resources.xaml"/> 
     <ResourceDictionary Source="pack://application:,,,/Module2;component/Module2Resources.xaml"/> 
    </ResourceDictionary.MergedDictionaries> 
</Application.Resources> 

に追加することによって、仕事を得ることができます。 xamlファイルを追加する必要があります。私が探しているのは、モジュールのための方法です.Apple.Resourcesに動的に追加するために読み込まれます。これは可能ですか?どのような方法でシェルに手を差し伸べるからあなたのモジュールとあなたのモジュールについて何を知っていることから、あなたのシェルアプリを回避するために

答えて

5

、:

Application.Current.Resources.MergedDictionaries 
       .Add(new ResourceDictionary 
       { 
        Source = new Uri(
         @"pack://application:,,,/MyApplication.Modules.Module1.Module1Init;component/Resources.xaml") 
       }); 

それとも、各モジュールの慣例に従えば、「Resources.xmal」と呼ばれるリソースディクショナリを持っているが...

protected override IModuleCatalog GetModuleCatalog() 
{ 
    var catalog = new ModuleCatalog(); 

    AddModules(catalog, 
       typeof (Module1), 
       typeof(Module2), 
       typeof(Module3), 
       typeof(Module4)); 

    return catalog; 
} 

private static void AddModules(ModuleCatalog moduleCatalog, 
    params Type[] types) 
{ 
    types.ToList() 
     .ForEach(x => 
      { 
       moduleCatalog.AddModule(x); 
       Application.Current.Resources.MergedDictionaries 
        .Add(new ResourceDictionary 
           { 
            Source = new Uri(string.Format(
                 @"pack://application:,,,/{0};component/{1}", 
                 x.Assembly, 
                 "Resources.xaml")) 
           }); 
       }); 
} 
+0

答えの最初の部分では、モジュールがアプリケーションに到達する必要があります。私はそれがuntestableであるのでこれに対して推薦する。 2番目のアプローチがより適切です。 –

19

、私はこのようなあなたのモジュールへのインターフェイスを提供したい:

IMergeDictionaryRegistry 
{ 
    void AddDictionaryResource(Uri packUri); 
} 

あなたは「あなたのモジュールのコードでは、このインタフェースを求めるdは:

public class MyModule : IModule 
{ 
    IMergeDictionaryRegistry _merger; 
    public MyModule(IMergeDictionaryRegistry merger) 
    { 
      _merger = merger; 
    } 

    public void Initialize() 
    { 
      _merger.AddDictionaryResource(new Uri("pack://application:,,,/Module1;component/Module1Resources.xaml"); 
    } 
} 

あなたがこれを行うには、あなたのシェルでこれを実装します:

public MergeDictionaryRegistry : IMergeDictionaryRegistry 
{ 
    public void AddDictionaryResource(Uri packUri) 
    { 
      Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary() 
      { 
       Source = packUri; 
      }); 
    } 
} 

そして最後には、あなたのブートストラップのConfigureContainerに:

public override void ConfigureContainer() 
{ 
    base.ConfigureContainer(); 
    Container.RegisterType<IMergeDictionaryRegistry, MergeDictionaryRegistry>(); 
} 

これはあなたが互いに独立したままになりますあなたのシェルと、あなたのモジュールを必要な機能を取得します。モジュールコードをテストするためにApplicationをスピンアップする必要がないという点で、より多くのテスト可能性があるという追加の利点があります(ちょうど模擬IMergeDictionaryRegistryとなっています)。

これがどのようにあなたのために行くのか教えてください。

アプリケーション・リソースに追加することができ、各モジュールの初期化の中で
+0

ありがとうございました。 WPFは、DataTemplateを使用してViewModelをレンダリングする方法を認識しています(http://msdn.microsoft.com/en-us/magazine/dd419663.aspx#id0090097参照)。問題は、別のアセンブリのDataTemplateについてAppに知らせることです。私は詳細を提供するために投稿を編集しました。 – Oll

+0

あなたは何をしているのか分かります。モジュールにいくつかのインターフェイス(パックURLを受け入れるメソッドを持つIMergeDictionaryRegistration)を用意し、アプリケーションのリソース辞書に追加する必要があります。ただの理論。 –

+0

また...これがどうやってあなたのために行くのか不思議です。我々に教えてください。それは面白いアプローチです。 –

1

これはすべて大変な作業のようです。

個人的に、私はちょうどその辞書をマージ

<UserControl.Resources> 
    <ResourceDictionary Source="../Resources/MergedResources.xaml" /> 
</UserControl.Resources> 

は、私は含める必要が任意のリソースを指して...このように私のビューの UserControl.Resourcesセクションにリソースディクショナリを宣言します。

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
<ResourceDictionary.MergedDictionaries> 
    <ResourceDictionary Source="Iconography.xaml" /> 
    <ResourceDictionary Source="Typeography.xaml" /> 
</ResourceDictionary.MergedDictionaries> 

あなたはそこに私が推測するに、あなたのデータテンプレートを宣言するだろう。

HTH。

関連する問題