1

MyResourceアプリケーションに次のようなクラスがあります。

public class MyResource : IMyResource
{
    // ... whatever ...
}

App.xaml.cs でアプリケーションを初期化すると、Autofac を使用して次のようになります。

builder.Register<IMyResource>(container => new MyResource());

ここで、次のように WPF アプリケーションにStaticResourceを追加する必要があります。Window

<Window.Resources>
    <local:MyResource x:Key="MyResource" />
</Window.Resources>

しかしもちろん、ここでの具体的なインスタンスを参照することは全体のアイデアではありませんMyResource。さらに、アプリケーション全体MyResourceで異なるWindowやのインスタンスを使用する必要がある場合があります。そのため、Autofac コンテナーを介して解決されるfor myUserControlのインスタンスを使用したいと思います。どうすればこれを達成できますか?MyResourceStaticResourceWindow

のコード ビハインドにリソースを追加することを考えていWindowましたが、コンテナーに不要な依存関係が作成される可能性があります。

アプリケーションを初期化するときに、App.xaml.cs でそのようなことをすることも考えていました。

App.Current.MainWindow.Resources.Add("MyResource", container.Resolve<IMyResource>());

しかし、XAML でリソースを使用すると

<ListBox ItemsSource="{Binding Source={StaticResource ResourceKey=MyResource}}"/>

MyResourceXAMLParseExceptionという名前のリソースが見つからないという内部例外のメッセージが表示されます。そして効いていたとしても、ちょっと臭い気がします。

では、これはどのように達成できるのでしょうか。可能なだけですか?そうでない場合、これを実装する最良の方法は何ですか?

4

1 に答える 1

1

次の手順を実行します

  • Autofac に登録MyWindowしてください。MyResource
  • IMyResourceのコンストラクターに配置しMyWindowます(はい、コードビハインドを変更していますが、コンテナーを参照していません。コードビハインドにコードを含めることができない場合(おそらくユーザーコントロール)、誰かが設定していることを確認してくださいDataContextどこか)
  • DataContext(コンストラクター内の)の具体的なインスタンスに設定するIMyResourceか、MVVMを使用している場合は、インスタンスをビューモデル(Autofacにも登録されます)に配置します。
  • 解決MyWindow

コード内:

MyWindow(IMyResource myResource) : this()
{
  DataContext = myResource;
}

ViewModel(Autofacにも登録されている)を使用している場合:

MyWindow(MyViewModel viewModel) : this()
{
  DataContext = viewModel;
}

この行をXAMLに追加します。

<Window.DataContext><local:IMyResource></Window.DataContext>

またはこれ:

<Window.DataContext><local:MyViewModel></Window.DataContext>

そして、のマークアップListBoxは簡単になります。

<ListBox ItemsSource="{Binding}"/>

Itemsまたは、ビューモデルを使用すると、たとえば、プロパティと同じように便利です。

<ListBox ItemsSource="{Binding Items}"/>
于 2012-06-24T16:51:00.433 に答える