我有一个用户控件(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调用一个方法。
答案 0 :(得分:1)
您可以在MainPage中添加更多事件侦听器,如下所示:
MyUCViewModel viewModel = myUC.DataContext;
viewModel.MyDataItems.ChosenItems.CollectionChanged
+= new NotifyCollectionChangedEventHandler(MainPage_ChosenItemsChanged);
答案 1 :(得分:1)
这是基于评论,因为这个问题有点误导:
虽然不是严格意义上的MVVM,但正如您的问题所示,您应该将用户控件编写为第三方控件,并在其上公开自定义事件。用户控件应始终是带有公共界面的黑盒子。对于一个自包含的可重用控件(尽可能多)MVVM是过度的。
添加:
public event EventHandler<MyEventArgs> MyEvent
创建一个源自MyEventArgs
的{{1}}类,并使其保存有用的参数(如所选项目)。
在您的主页面中,在您动态添加的每个用户控件上为EventArgs
添加处理程序。
我实际上认为MVVM模型存在缺陷,所有这类控制逻辑和事件处理程序都属于MyEvent
类(MVCVM!),但这是另一个故事。:)< / p>