0

ビューモデルでは、MEFedMVVMを使用してインスタンス化されますViewModelLocatorMEFedMVVMビューモデルに任意のコンストラクターを使用できるため、非常に強力です。

[ExportViewModel("MyViewModel")]
public class MyViewModel : NotifyPropertyChangedBase
{
    [ImportingConstructor]
    public MyViewModel(IMediator mediator, IContainerStatus containerStatus, IDispatcherService dispatcherService)
    {
    }    
}

IMediatorIContainerStatusおよびIDispatcherServiceは、 を通じてインスタンス化されるサービス インターフェイスMEFです。明らかに、必要に応じて独自のサービスを作成できます。

問題

ビューが読み込まれたら、その子のreadonlyプロパティのメンバーにビューモデルのデータを割り当てる必要があります。理想的には、この変数を に直接バインドしますXAMLが、プロパティは読み取り専用であり、そのメンバーはアタッチ可能なプロパティではないため、それを行うことはできません。現在、私は醜い回避策を持っています:

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    var viewModel = DataContext as MyViewModel;
    this.child.SomeReadonlyProperty.Data = viewModel.MyData;
}

ビューとビューモデルのこの結合を取り除きたいです。との両方が役立つ可能性のあるさまざまなパターンMEFedMVVMPrism提供しますが、どちらをどのように使用すればよいかわかりません。サービスがビューとビューモデルの両方にアクセスできるようにしても問題ありませんか?

Q: カップリングを取り外すには、どのようなパターンを使用すればよいですか?

4

1 に答える 1

1

プロパティを設定するために必要な動作を説明するビューを実装できるインターフェイスを作成する傾向があると思います。

interface IMyView
{
    void SetReadOnlyProperty(object value);
}

次に、ビューでの実装を作成SetReadOnlyPropertyし、ビューをタイプとしてエクスポートし、IMyView最後に、タイプのビューモデルにインポートを作成してIMyView、メソッドを公開し、ビューモデルからの呼び出しを実行できるようにします。ビューモデルはビューを認識せず、必要なものを公開するインターフェイスを持っているだけなので、これはMVVMの精神に反するものではないと思います。

于 2013-01-27T21:41:30.890 に答える