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

本文关键字:实例 设置 对象引用 MVVM- | 更新日期: 2023-09-27 18:29:21

我正试图将我创建的WPF(不使用MVVM和DataBinding)更改为使用这些强大功能的WPF。

我已经设置了一个具有多个属性的人员模型(太长了,无法在此处列出),包括所有的get和set,甚至还有NotifyProtertyChanged属性,如ID和FullName属性。

现在,我想(在编写代码时,只需点击一个按钮即可启动代码,以确保我知道它何时开始)让我的WPF应用程序浏览一个值列表,将其与在线XML文档进行比较,并从中检索列表中与所查找值相匹配的每个人的数据列表,当然还设置了模型的一些属性。

例如:-寻找"Lewitt"-XML文档有4个姓Lewitt的人,所以它将这4个人添加到我的列表中(包括设置为我之前设置的Person模型类的项目),并设置每个项目的ID和FullName的值(示例中简称为)。

这是我在搜索某个值(称为searchstring)时实现的informationProvider类:

    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"的示例值,该值确实存在于我们在InformationProvider类中查找的XML文档中:

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

我的问题是,当我启动代码并点击按钮进行测试时,它会抛出一个错误,说明"对象引用未设置为对象实例",并突出显示我的行

        persons= informationProvider.GetPeople(searchShowName);

我该怎么解决这个问题?

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

personnel=informationProvider.GetPeople(searchShowName);

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

通过查看你的方法GetPeople,可以肯定地说,你可以让它像这个一样是静态的

 public static List<Person> GetPeople(string searchstring)

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

您需要将GetPeople设置为静态:

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

或者创建informationProvider类的实例:

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

请注意我是如何更改大小写的,并且没有创建一个多余的空列表。