【问题标题】:trouble Instantiating Model Class Within ViewModel Class C#在 ViewModel 类 C# 中实例化模型类的麻烦
【发布时间】:2019-12-01 16:45:55
【问题描述】:

我正在尝试在我的 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# wpf visual-studio mvvm


    【解决方案1】:

    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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-04
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多