2

アプリケーションを構築するためにMEFとMVVMLightを使用しようとしています。

うまく機能してインポートに成功したものを接続することができましたが、その過程でViewModelLocatorを完全に見逃しているようで、ViewModelLocatorでMEFを適切に使用する方法と、実際に必要かどうか疑問に思っています。私のデザインが間違っていますか?

したがって、App.xamlではstartupUriを無効にし、App.xaml.csでは次のようにします。

[Import("MainWindow", typeof(Window))]
public new Window MainWindow
{
    get { return base.MainWindow; }
    set { base.MainWindow = value; }
}

protected override void OnStartup(StartupEventArgs e)
{
    base.OnStartup(e);
    // Load catalog in normal way
    ...
    MainWindow.Show();
}

私のMainWindowコードはこれです:

[Export("MainWindow", typeof(Window))]
public partial class MainWindow : Window
{
    [ImportingConstructor]
    public MainWindow([Import("MainViewModel")] MainViewModel vm)
    {
        InitializeComponent();
        DataContext = vm;
    }
}

最後に私のViewModelはこれです:

[Export("MainViewModel", typeof(MainViewModel))]
public class MainViewModel : ViewModelBase, IPartImportsSatisfiedNotification
{
    // I do some MEF imports here also
}

しかし、私はこれを正しい方法で何をしているのでしょうか、それとももっと賢明なアプローチがありますか?ViewModelLocatorを本当に無視できますか?

4

1 に答える 1

3

これが「正しい」方法かどうかはわかりませんが、ViewModelLocatorを直接使用することもありません。私は通常Prismを使用し、ブートストラッパーアプローチを使用してMEFを実装しますが、次のようにしてビューをビューモデルに接続します。

[Import]
public TransactionViewModel ViewModel
{
    get { return (TransactionViewModel)DataContext; }
    set { DataContext = value; }
}

これは、ビューの背後にあるコードでViewModelを表すプロパティです。このように、私はウィンドウのコンストラクターに対して何もしていません。あなたの例では、デフォルトのコンストラクターはもうありません(少なくともあなたが示しているもの)。これはおそらくここでは問題ではありませんが、これを行う習慣があり、WPFにビューをインスタンス化させる必要がある場合(たとえば、データコンテキストで)、問題が発生します。

しかし、これを除けば、あなたがしていることは私にはかなり標準的に見えます。PrismによるMEFの実装も確認することをお勧めします。PrismにはUnityも含まれています。Unityは別の目的を達成し、アプリフレームワークの作成をはるかに簡単にする他の機能も備えています。

于 2013-02-04T05:24:14.010 に答える