0

私はMVVMLightの使用法を学び、EntityFrameworkでデータベースファーストモデルを使用するプログラムを作成しています。

リポジトリからデータを取得するViewModelにバインドされたDataGridがあります。クリックするとウィンドウが開き、独自のView Modelにバインドされ、DataGridにレコードを追加できるボタンを作成しようとしています。 DataGridViewModelを更新できるように、アイテムが追加されたときに呼び出されるイベントを持つリポジトリに追加します。

ここのすべては大丈夫です。フォームを開き、データを入力して[追加]を押すと、レコードがデータベースに追加され、DataGridがリポジトリイベントによって自動的に更新されます。

複数の「レコードの追加」ウィンドウを開くと、問題が発生します。一方のウィンドウに何かを入力すると、もう一方のウィンドウに表示されます。

[レコードの追加]ウィンドウの両方のインスタンスがビューモデルの同じインスタンスにバインドされているため、これが発生していることを認識しています。

この問題を解決して、すべてのウィンドウを独立させる方法はありますか?現時点ではこれはそれほど問題にはならないようですが、将来的には同じウィンドウを同じビューモデルで使用してレコードを編集することを計画しています(これは良いアプローチであり、通過する方法をお勧めしますか?レコードIDまたはレコード自体をDataGridウィンドウから[レコードの追加/編集]ウィンドウに移動しますか?)

前もって感謝します!私が何かを逃したかどうか教えてください、そして私はそれを追加します:)

編集: わかりました、これは私が思いついたものです:

public EditParentViewModel EditParent
    {
        get
        {
            EditParentViewModel editParentViewModelInstance = new EditParentViewModel(ServiceLocator.Current.GetInstance<IParentsRepository>(),
                ServiceLocator.Current.GetInstance<IChildrenRepository>(),
                ServiceLocator.Current.GetInstance<IBailiffsRepository>());
            return editParentViewModelInstance;
        }
    }

動作していますが、これはビューモデルにリポジトリを提供する正しい方法ですか?

4

1 に答える 1

0

あなたが使用していることを数えると、あなたはViewModelLocatorこのようなものを持っているはずです:

public class ViewModelLocator
{
    public ViewModelLocator()
    {
        ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);

        SimpleIoc.Default.Register<AddRecordViewModel>();
    }

    public AddRecordViewModel AddRecordViewModel
    {
        get { return ServiceLocator.Current.GetInstance<AddRecordViewModel>(); }
    }
}

毎回新しいビューモデルを返すだけです。

public class ViewModelLocator
{
    public ViewModelLocator()
    {
    }

    public AddRecordViewModel AddRecordViewModel
    {
        get { return new AddRecordViewModel(); }
    }
}

そうすれば、フォームは、に割り当てられている現在のインスタンスを取得するのではなく、常に新しいビューモデルを取得しますServiceLocator

于 2013-02-14T19:02:33.273 に答える