0

私はWPFとMVVMを学習しており、DataGridと、DataGridにアイテムを追加できるコマンドを使用して別のフォームを開くボタンを備えたプログラムを作成しようとしています。

問題は、ビューモデルでこれをどのように実装すべきかわからないことです。正しく機能し、リポジトリを使用してEntityFrameworkからデータを取得するDataGridフォーム用のビューモデルが1つあります。

追加フォームからオブジェクトを追加し、追加ボタンを押したときに他のフォームのDataGridに自動的に表示されるようにすることはできますか、それともDataGridで更新アクションを実行する必要がありますか?ビューモデルで監視可能なコレクションを使用しており、ビューモデルのコレクションパラメーターにOnPropertyChange機能を実装しました。

リポジトリに何かを入れたときに理解できる限り、そこからデータを取得するすべてのビューモデルを更新する必要があります...それを機能させるためにメッセージコードを作成する必要があるかどうかはわかりませんが。

私はこれについてかなり混乱しています、そして誰かがここでいくつかの光を当てることができることを願っています...よろしくお願いします。私が何かに言及するのを逃したかどうか教えてください、そして私はそれを追加します:)

編集:これは私が私のモデルを登録する方法です:

SimpleIoc.Default.Register<ParentsListViewModel>();
SimpleIoc.Default.Register<EditParentViewModel>();

そして、これが私のリポジトリを登録する方法です:

SimpleIoc.Default.Register<IParentsRepository, ParentsRepository>();

そして、これは私がViewModelsのインスタンスを取得する方法です:

ParentsListViewModel parentsListViewModelInstance =  ServiceLocator.Current.GetInstance<ParentsListViewModel>();
EditParentViewModel editParentViewModelInstance = ServiceLocator.Current.GetInstance<EditParentViewModel>();

ParentsListViewModelは私のDataGridViewModelであり、EditParentViewModelはリポジトリ内のレコードを追加/編集するために使用されるものです。サービスロケーターはリポジトリのインスタンスを自動的に渡すので、リポジトリのインスタンスをViewModelsに渡す方法がわかりません。同じインスタンスを渡しますか?

4

1 に答える 1

1

リポジトリに何かを追加しても、ビュー モデルは自動的に更新されません。

監視可能なコレクションが行うことは、新しいアイテムが監視可能なコレクションに追加/削除されたときに UI に通知することだけです (大まかに言えば)。INotifyPropertyChange が行うことは、特定のプロパティが変更されたことを UI に通知することだけです。

作業したいものを取得するためのいくつかのオプションがあります(私があなたを正しく理解していれば):

  • アイテムが追加されたときに、監視可能なコレクション全体を更新できます
  • 新しいアイテムが追加されたときに、データグリッド ビュー モデルにイベントを通知するようにリポジトリを取得できます。その後、データグリッド ビュー モデルは、監視可能なコレクションを更新できます。
  • Add Form ビュー モデルを Data Grid ビュー モデルと通信させ、新しいアイテムが追加されたときにそれを伝えることができます。この状況では、あるビュー モデルから別のビュー モデルに情報をマーシャリングするための何らかのメカニズムが必要になります。

これは役に立ちますか?

編集 2013 年 12 月 2 日 17:30 GMT:

これは、オプション 2 がどのように見えるかの非常に簡単で汚い例です。リポジトリの同じインスタンスが 2 つのビュー モデル間で共有されている必要があります。この場合、コンストラクターに注入しました。

public interface IParentsRepository{
    event EventHandler<MyItemAddedEventArgs> ItemAdded;     

    //your normal interface implementation here
}

public class ParentsRepository : IParentsRepository
{
    public event EventHandler<MyItemAddedEventArgs> ItemAdded;

    public List<MyItem> GetAllItems()
    {
        //logic that returns all your items here
        return new List<MyItem>();
    }

    public void AddItem(MyItem item)
    {
        //logic that adds you item here

        //fire the item added event
        OnItemAdded(item);
    }

    private void OnItemAdded(MyItem item)
    {
        if(ItemAdded != null)
            ItemAdded(this, new MyItemAddedEventArgs(item));
    }
}

public class MyItemAddedEventArgs : EventArgs
{
    public MyItemAddedEventArgs(MyItem itemAdded)
    {

    }

    public MyItem ItemAdded { get; set; }
}

public class MyItem
{
    public string SomeProperty { get; set; }    
}

public class MyDataGridViewModel
{
    private readonly IParentsRepository _parentsRepository;

    public MyDataGridViewModel(IParentsRepository parentsRepository)
    {
        _parentsRepository = parentsRepository;
        _parentsRepository.ItemAdded += _parentsRepository_ItemAdded;

        var myItems = _parentsRepository.GetAllItems();
        MyItems = new ObservableCollection<MyItem>(myItems);
    }

    void _parentsRepository_ItemAdded(object sender, MyItemAddedEventArgs e)
    {
        if(!MyItems.Contains(e.ItemAdded))
            MyItems.Add(e.ItemAdded);
    }

    public ObservableCollection<MyItem> MyItems { get; set; }
}

public class MyAddItemViewModel
{
    private readonly IParentsRepository _parentsRepository;

    public MyAddItemViewModel(IParentsRepository parentsRepository)
    {
        _parentsRepository = parentsRepository;
    }

    //your logic to add an item here
}

このメソッドはメソッド 1 に合わせて簡単に調整できます。これにより、_parentsRepository_ItemAdded イベントが発生したときに、新しいアイテムを追加するだけでなく、データセット全体を再度取得できます。

于 2013-02-12T10:05:44.867 に答える