0

我有一个用户控件(MyUC),它以编程方式多次添加到页面(MainPage)中。

在 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 进行更改时,我都会收到一个消息框。

我现在要弄清楚的部分是如何设置它,以便我的 MainPage 在我的用户控件中触发 ChosenItemsChanged 事件时执行某些操作。我想要做的是让 MainPage 循环通过页面上生成的 MyUC 控件并使每个用户控件调用一个方法。

4

2 回答 2

1

您可以像这样在 MainPage 中添加更多事件侦听器:

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

这是基于评论,因为这个问题有点误导:

虽然严格来说不是 MVVM,但您的问题似乎是,您应该像编写第三方控件一样编写用户控件,并在其上简单地公开一个自定义事件。用户控件应始终是具有公共界面的黑盒。对于一个自包含的可重用控件(很多都是)MVVM 是矫枉过正的。

例如

在您的用户控制中添加:

public event EventHandler<MyEventArgs> MyEvent

创建一个MyEventArgs派生自的类EventArgs并让它保存有用的参数(如所选项目)。

在您的主页中,MyEvent在您动态添加的每个用户控件上添加一个处理程序。

我实际上认为 MVVM 模型是有缺陷的,所有这些控制逻辑和事件处理程序都属于一个Controller类(MVCVM!),但这是另一回事。:)

于 2012-05-25T09:20:42.587 回答