首页 > 解决方案 > 在 ViewModel 类 C# 中实例化模型类的麻烦

问题描述

我正在尝试在我的 viewmodel 类中从我的 MVVM 测试项目中实例化我的模型类的一个对象。

人物模型类:

using System.ComponentModel;

namespace WPFAppTest.Models
{
    public class Person : INotifyPropertyChanged
    {
        private string _FirstName;
        public string FirstName
        {
            get
            {
                return _FirstName;
            }
            set
            {
                _FirstName = value;
                RaisePropertyChange("FirstName");
                RaisePropertyChange("FullName");
            }
        }
        private string _LastName;
        public string LastName
        {
            get
            {
                return _LastName;
            }
            set
            {
                _LastName = value;
                RaisePropertyChange("LastName");
                RaisePropertyChange("FullName");
            }
        }
        public string FullName
        {
            get
            {
                return _FirstName + " " + _LastName;
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        private void RaisePropertyChange(string property)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property));
        }

    }
}

PersonViewModel 类:

using WPFAppTest.Models;

namespace WPFAppTest.ViewModels
{
    public class PersonViewModel
    {
        public Person person = new Person();

        person.FirstName = "Iain";
    }
}

似乎我收到一条错误消息,提示“当前上下文中不存在名称‘person.FirstName’”。

如何创建对象然后访问其属性以设置值?然后我可以将哪个用于我的视图中的数据绑定?

标签: c#wpfvisual-studiomvvm

解决方案


该语句person.FirstName = "Iain";必须在方法或构造函数中

public class PersonViewModel
{
    public Person person = new Person();

    public PersonViewModel() // constructor
    {
        person.FirstName = "Iain";
    }

    public void Test() // method
    {
        person.FirstName = "Pete";
    }
}

注意:创建对象时自动调用的构造函数与new PersonViewModel()类同名并且没有返回类型(没有void关键字)。

该方法Test必须显式调用

var p = new PersonViewModel(); // calls constructor and assigns "Iain".
p.Test(); // Assigns "Pete"

构造函数可以像方法一样具有参数。

public PersonViewModel(string personName) // constructor with parameter
{
    person.FirstName = personName;
}

调用时必须将参数传递给此参数new

var p = new PersonViewModel("Sue"); // Creates a VM with a person named "Sue".

对于视图模型,传递一个 Person 可能是有意义的。

public class PersonViewModel
{
    private readonly Person _person;

    public string FirstName => _person.FirstName;

    public PersonViewModel(Person person) // constructor
    {
        _person = person;
    }
}

推荐阅读