LoadData方法中的事件未触发

时间:2014-03-25 10:41:01

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

情况:

  • 我在viewmodels中有两个类:MedicineModel和MedicineData。
  • 我有一个事件Event1,我在位于MedcineModel.cs的LoadData方法结束时触发。
  • 然后在MainPage.xaml.cs中处理此事件,其中事件处理程序 指向我想要执行的一种非常方法。

问题:

  • 问题是Event1没有触发。

这是app.xaml.cs的代码

private static MedicineModel viewModel = null;
    public static MedicineModel  ViewModel {

        get
        {
            if (viewModel==null)
            {
                viewModel = new MedicineModel();
                viewModel.LoadData();
            }
            return viewModel;
        }

    }

MedicineModel.cs的代码是

namespace MedicinePlus.ViewModels
{
public delegate void EventDelegate();
public class MedicineModel
{
    public List<MedicineData> Problems { get; set; }
    public MedicineModel()
    {
        this.Problems = new List<MedicineData>();
    }

    public bool IsDataLoaded { get; set; }
    public event EventDelegate Event1;
    public void LoadData()
    {
    //place rt time Data here
        IsDataLoaded = true;
        this.Problems.Add(new MedicineData() { ID = 0, ProblemName = "Fever"});
        this.Problems.Add(new MedicineData(){ID=1,ProblemName="Diarrhea"});
        this.Problems.Add(new MedicineData() { ID=2,ProblemName = "sprain"});
        this.Problems.Add(new MedicineData() { ID = 3, ProblemName = "bruise" });

        OnEvent1();
    }

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

和MainPage.xaml.cs的代码是

其中textListViewSource是集合视图源的名称,listBoxTextItems是listBox的名称

public partial class MainPage : PhoneApplicationPage
{
    // Constructor
    public MainPage()
    {
        InitializeComponent();

        // Set the data context of the listbox control to the sample data
        DataContext = App.ViewModel;

        App.ViewModel.Event1 += new EventDelegate(eventHandler);

        // Sample code to localize the ApplicationBar
        //BuildLocalizedApplicationBar();
    }

    private void eventHandler()
    {             
        textListViewSource.Source = App.ViewModel.Problems;
        listBoxTextItems.DataContext = App.ViewModel.Problems;
    }

2 个答案:

答案 0 :(得分:3)

让我们看看你的应用的工作流程:

  1. 您正在访问App.ViewModel属性,以检索视图模型并将其分配给您的datacontext
  2. App.ViewModel属性的getter中,实例化viewmodel,并调用LoadData方法
  3. LoadData方法中,您(显然)加载数据,然后提升Event1事件
  4. getter完成执行,您检索viewmodel的实例
  5. 您订阅了Event1活动
  6. 按照这些步骤,Event1事件无法在MainPage中引发,因为您在>之后订阅了

答案 1 :(得分:-1)

我已在此处上传了工作测试项目 - http://1drv.ms/NOvNSd。它是一个基于您的类的WPF项目,但您可以轻松地从中获取代码并将其放入Windows Phone项目中。