如何在Silverlight中订阅子用户控件中的事件?

时间:2012-05-23 21:49:03

标签: silverlight

我有一个用户控件(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中进行更改时,我都会收到消息框。

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

2 个答案:

答案 0 :(得分:1)

您可以在MainPage中添加更多事件侦听器,如下所示:

MyUCViewModel viewModel = myUC.DataContext;
viewModel.MyDataItems.ChosenItems.CollectionChanged 
  += new NotifyCollectionChangedEventHandler(MainPage_ChosenItemsChanged);

答案 1 :(得分:1)

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

虽然不是严格意义上的MVVM,但正如您的问题所示,您应该将用户控件编写为第三方控件,并在其上公开自定义事件。用户控件应始终是带有公共界面的黑盒子。对于一个自包含的可重用控件(尽可能多)MVVM是过度的。

e.g。

用户控件中的

添加:

public event EventHandler<MyEventArgs> MyEvent

创建一个源自MyEventArgs的{​​{1}}类,并使其保存有用的参数(如所选项目)。

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

我实际上认为MVVM模型存在缺陷,所有这类控制逻辑和事件处理程序都属于MyEvent类(MVCVM!),但这是另一个故事。:)< / p>