2

私はいくつかの助けを探しています、そして私はそこにいるいくつかの良い魂が私にヒントを与えることができることを願っています:)

MVVMLightを使用して新しいアプリケーションを構築しています。このアプリケーションでは、ビューが作成されると、MEFインポートを使用して対応するViewModelをインスタンス化します。

ここにいくつかのコードがあります:

public partial class ContractEditorView : Window
{
    public ContractEditorView ()
    {
        InitializeComponent();
        CompositionInitializer.SatisfyImports(this);
    }

    [Import(ViewModelTypes.ContractEditorViewModel)]
    public object ViewModel
    {
        set
        {
            DataContext = value;
        }
    }
}

そして、これがViewModelのエクスポートです。

[PartCreationPolicy(CreationPolicy.NonShared)]
[Export(ViewModelTypes.ContractEditorViewModel)]
public class ContractEditorViewModel: ViewModelBase
{
    public ContractEditorViewModel()
    {
        _contract = new Models.Contract();
    }
}

これは、新しい契約を作成するために新しいウィンドウを開きたい場合に機能します...つまり、既存の契約のIDを渡す必要がない場合に最適です。

ただし、既存の契約を編集するために同じビューを使用したいとします。この場合、同じビューに新しいコンストラクターを追加します。このコンストラクターは、モデルIDまたはモデルオブジェクトのいずれかを受け入れます。

「残念ながら」ViewModelは常に同じ方法で作成されます。

    [Import(ViewModelTypes.ContractEditorViewModel)]
    public object ViewModel
    {
        set
        {
            DataContext = value;
        }
    }

私の知る限り、これにより、構成時に対応するViewModelの標準/パラメーターなしコンストラクターが呼び出されます。

では、私が知りたいのは、この動作をどのように区別するかです。作成時に特定のコンストラクターを呼び出すにはどうすればよいですか?または、インポート中にいくつかのパラメーターを渡すにはどうすればよいですか?

この質問がばかげているように聞こえたら本当にお詫びしますが、私は最近MEFを使い始めたばかりです!

前もって感謝します、

乾杯、ジャンルカ。

4

1 に答える 1

0

あなたはこれを行うことができます。MVVM-Light でのメッセンジャーの実装を確認してください。NotificationMessage(Of Integer)を渡して、正しい ID をビュー モデルに送信できます。ビュー モデルは、そのタイプのメッセージを登録し、メッセージが送信されたときにそれをロードする必要があります。

デフォルトでは、MEF インポートにはパラメーターなしのコンストラクターしかありません。

于 2010-07-01T07:35:12.190 に答える