制作视图模型错误

Making a viewmodel error

我是第一次制作视图模型,经过一番研究,我得到了以下代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HotelWPF
{
    public class ReservationVM : INotifyPropertyChanged
    {
        public Reservation reservation = new Reservation();
        private string SecretaryName;
        private int RoomNumber;
        private string ReservationType;
        private DateTime ReservationDate;

        public string SecretaryName1
        {
            get
            {
                return SecretaryName;
            }

            set
            {
                SetProperty(ref SecretaryName, value);
            }
        }

        public int RoomNumber1
        {
            get
            {
                return RoomNumber;
            }

            set
            {
                SetProperty(ref RoomNumber, value);
            }
        }

        public string ReservationType1
        {
            get
            {
                return ReservationType;
            }

            set
            {
                SetProperty(ref ReservationType, value);
            }
        }

        public DateTime ReservationDate1
        {
            get
            {
                return ReservationDate;
            }

            set
            {
                SetProperty(ref ReservationDate, value);
            }
        }
        public void SetProperty<T>(ref T store, T value, [CallerMemberName] string name = null)
        {
            store = value;
            if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedArgs(name));

        }
    }
}

我收到以下错误:

PropertyChanged doesn't exist in current context.

CallerMemberName 也给我一个错误:

Type or namespace couldn't be found

作为一年级学生制作视图模型非常困难,将不胜感激

编辑: 这是我的模型之一 类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HotelWPF
{
   public class Reservation
    {
        private string SecretaryName;
        private int RoomNumber;
        private string ReservationType;
        private DateTime ReservationDate;

        public string SecretaryName1
        {
            get
            {
                return SecretaryName;
            }

            set
            {
                SecretaryName = value;
            }
        }

        public int RoomNumber1
        {
            get
            {
                return RoomNumber;
            }

            set
            {
                RoomNumber = value;
            }
        }

        public string ReservationType1
        {
            get
            {
                return ReservationType;
            }

            set
            {
                ReservationType = value;
            }
        }

        public DateTime ReservationDate1
        {
            get
            {
                return ReservationDate;
            }

            set
            {
                ReservationDate = value;
            }
        }
    }
}

你实际上没有实现INotifyPropertyChanged;您刚刚在 class 声明中向编译器承诺,此处:

ReservationVM : INotifyPropertyChanged

现在它让你信守诺言。要实现该特定接口,您只需在视图模型 class、ReservationVM 中实现 PropertyChanged 事件。这很简单,只需添加定义它的这一行:

public event PropertyChangedEventHandler PropertyChanged;

Visual Studio 也会为您实现接口。右键单击顶部 class 声明中的接口名称,然后从上下文菜单中选择 "Implement Interface"(取决于 VS 版本,它可能位于 "Quick Actions and Refactorings" 下)。您不想实施 "explicitly",只是常规 "implement"。

一旦存在,您就需要 CallerMemberNameAttribute 的命名空间。这也很快:

添加这一行:

using System.Runtime.CompilerServices;

...到文件顶部。

我想说的另一点是关于属性的命名。它不会破坏任何东西,但是您提出的 public/private 命名约定不是一个好主意。这是更常见的约定:

    private string _secretaryName;
    public string SecretaryName
    {
        get
        {
            return _secretaryName;
        }

        set
        {
            SetProperty(ref _secretaryName, value);
        }
    }

PropertyChanged是需要INotifyPropertyChanged定义的事件。 最简单 的方法是使用 "Implement interface" 建议,将输入光标放在代码中的 INotifyPropertyChanged 上,然后按 Ctrl+. 您也可以将鼠标悬停在它上面,然后单击出现的灯泡。

或者只需将以下行添加到您的视图模型中:

public event PropertyChangedEventHandler PropertyChanged;

您的另一个错误是因为您没有为 CallerMemberName 添加命名空间。您可以按照与上面相同的方式从 "using" 建议中获取它,或者将以下行添加到您的视图模型文件的顶部:

using System.Runtime.CompilerServices;