0

プログラムでページ (MainPage) に数回追加されたユーザー コントロール (MyUC) があります。

MyUC では、DataContext を次のようなビュー モデルに設定します。

    private void UserControl_Loaded(object sender, RoutedEventArgs e)
    {
        DataContext = new MyUCViewModel();
    }

ビュー モデル (MyUCViewModel) には、データ項目のコレクションがあります。

    public MyDataItemCollection MyDataItems { get; private set; }

そして、コンストラクターには次のものがあります。

    public MyUCViewModel()
    {
        this.MyDataItems = new MyDataItemCollection();
        this.MyDataItems.ChosenItems.CollectionChanged += new NotifyCollectionChangedEventHandler(ChosenItemsChanged);

        this.MyDataItems.Add(new DataItem());
    }

上記の MyDataItems には、ChosenItems の別のコレクションがあり、それに NotifyCollectionChangedEventHandler を追加しました。

私のコードの他の部分は、ChosenItems コレクションから追加および削除され、その部分は正常に機能しているようです。

次に、ビュー モデルにイベント ハンドラー メソッドを追加します。

    private void ChosenItemsChanged(object sender, EventArgs e)
    {
        MessageBox.Show("Chosen Items Changed");
    }

これも機能し、ChosenItems コレクションに影響する UI をユーザーが変更するたびに、メッセージ ボックスが表示されます。

私が今理解しようとしている部分は、ユーザー コントロールで ChosenItemsChanged イベントが発生したときに MainPage が何かを行うように設定する方法です。私がやりたいことは、ページ上で生成された MyUC コントロールを MainPage ループさせ、各ユーザーコントロールにメソッドを呼び出させることです。

4

2 に答える 2

1

質問は少し誤解を招くものだったので、これはコメントに基づいています。

厳密にはMVVMではありませんが、質問のように思われるように、ユーザーコントロールをサードパーティのコントロールであるかのように記述し、カスタムイベントを公開する必要があります。ユーザーコントロールは、常にパブリックインターフェイスを備えたブラックボックスである必要があります。自己完結型の再利用可能なコントロールの場合(多くの場合)、MVVMはやり過ぎです。

例えば

ユーザーコントロールに次を追加します。

public event EventHandler<MyEventArgs> MyEvent

MyEventArgsから派生するクラスを作成し、EventArgsそれが有用なパラメーター(選択されたアイテムなど)を保持するようにします。

MyEventメインページで、動的に追加する各ユーザーコントロールにハンドラーを追加します。

実際、MVVMモデルには欠陥があり、この種の制御ロジックとイベントハンドラーはすべてControllerクラス(MVCVM!)に属していると思いますが、それは別の話です。:)

于 2012-05-25T09:20:42.587 に答える
1

次のように、MainPage にさらにイベント リスナーを追加できます。

MyUCViewModel viewModel = myUC.DataContext;
viewModel.MyDataItems.ChosenItems.CollectionChanged 
  += new NotifyCollectionChangedEventHandler(MainPage_ChosenItemsChanged);
于 2012-05-25T01:48:44.797 に答える