MVVM - 对象引用未设置为实例

时间:2013-08-27 12:07:37

标签: c# wpf data-binding mvvm

我正在尝试将我创建的WPF(不使用MVVM和DataBinding)更改为使用这些宏观功能的WPF。

我已经设置了一个具有多个属性的人员模型(这里列出的篇幅太长),包含所有的gets和sets,甚至还有NotifyProtertyChanged属性,例如ID和Full Name属性。

现在我想(通过单击按钮启动代码以确保我在编写代码时知道它何时启动)让我的WPF应用程序遍历值列表,将其与在线XML进行比较为列表中与查找的值匹配的每个人记录并检索其中的数据列表,当然还要设置一些模型的属性。

一个例子: - 寻找“Lewitt” - XML文档有4个人姓Lewitt所以它将这4个人添加到我的列表中(包括设置为我之前设置的Person模型类的项)并设置每个项的ID和FullName的值(缩写为例子)。

这是我在搜索某个值(称为searchstring)时到目前为止实现的我的infoProvider类:

    public List<Person> GetPeople(string searchstring)
    {
        string url = string.Format("{0}{1}", BaseURL, HttpUtility.HtmlEncode(searchstring));
        XDocument doc = XDocument.Load(url);

        var names = (from s in doc.Root.Elements("Persons").Where(s => s.Element("Lastname").Value.Equals(searchstring, StringComparison.InvariantCultureIgnoreCase))
                     select new Person
                     {
                         ID = Convert.ToInt32(s.Element("id").Value),
                         fullName = s.Element("Firstname").Value + " " + s.Element("Lastname").Value
                     }).OrderBy(n => n.fullName).ToList();
        return people;
    }

我尝试通过单击按钮(同样,仅用于测试目的)为我的项目列表启动此过程 - 我已经设置了一个示例值“Jane Doe”,它存在于我们正在寻找的XML文档中在InformationProvider类中:

            List<Person> persons= new List<Person>();
            persons= informationProvider.GetPeople(searchShowName);

我的问题是,当我启动代码并单击某个按钮进行测试时,它会抛出一个错误,指出“对象引用未设置为对象的实例”。并突出我的行

        persons= informationProvider.GetPeople(searchShowName);

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

你需要让GetPeople静止:

class InformationProvider
{
    public static List<Person> GetPeople(string searchstring)
    {
        //...
    }
}

或创建informationProvider类的实例:

InformationProvider informationProvider = new InformationProvider();
List<Person> persons = informationProvider.GetPeople(searchShowName);

请注意我是如何更改套管的,并没有创建冗余的空列表。

答案 1 :(得分:1)

  

persons = informationProvider.GetPeople(searchShowName);

这会引发错误,因为尚未实例化信息提供程序。

通过查看你的方法GetPeople,可以说你可以像这样使它静止

 public static List<Person> GetPeople(string searchstring)

然后直接从类名中调用它。