如何在MainPage.xaml.cs的构造函数中将事件处理程序注册到另一个类的事件

时间:2014-03-23 11:03:16

标签: c# wpf xaml windows-phone-8

情况:

  • 我有一个MainViewModel类,其中包含一个名为
    的集合 ItemViewModel类的“问题”

  • 我在MainviewModel类中有一个loadData函数,其中
    实例化ItemViewModel类,并将实例添加到
    问题收集。

  • 我还有一个在LoadData结束时触发的公共事件Event1 功能

怀疑:

我想在MainPage.xaml.cs的构造函数中注册Event1,以便它指向MainPage.xaml.cs中定义的eventhandler。它是怎么做到的?

以下是MainViewModel类的代码片段,为了清楚起见,已跳过某些声明

    public event EventDelegate Event1;
    public void LoadData()
    {
    //place RT  data here

        this.Problems.Add(new ItemViewModel() { ID = 0, ProblemName = "Fever"});
        this.Problems.Add(new ItemViewModel(){ID=1,ProblemName="Diarrhea"});
        this.Problems.Add(new ItemViewModel() { ID=2,ProblemName = "sprain" });
        this.Problems.Add(new ItemViewModel() { ID = 3, ProblemName = "bruise" });

        OnEvent1();
    }

   protected virtual void OnEvent1()
   {
       EventDelegate handler = Event1;
       if (handler!=null)
       {
           handler();
       }
   }

1 个答案:

答案 0 :(得分:0)

您必须将DataContext的{​​{1}}设置为MainPage,因此请在MainViewModel

之后获取实例并在构造函数中挂钩您的事件
InitializeComponent()

<强>更新

征求意见:

  

我们正在连接事件处理程序和event1,我们不应该写   ((MainViewModel)DataContext)。Event1 + = new HandlerName。

不,你不需要。无论如何,你的代码不会工作,必须使用代理名称,即

public MainPage()
{
   InitializeComponent();
   ......
   ((MainViewModel)DataContext).Event1 += HandlerName;
   ......
}

前面提到的一个和上面说的一个是等价的。

  

第二个是语句DataContext = App.ViewModel.MainViewModel;   放置在InitializeComponent()之后;将datacontext设置为   MainViewModel。

是的,你可以在((MainViewModel)DataContext).Event1 += new EventDelegate(HandlerName); 之前或之后放置它,它会起作用。