C# 生成viewmodel错误

C# 生成viewmodel错误,c#,wpf,visual-studio,mvvm,viewmodel,C#,Wpf,Visual Studio,Mvvm,Viewmodel,我是第一次制作viewmodel,经过一些研究,我得到了以下代码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; namespace HotelWPF { public class ReservationVM : INotifyPropertyC

我是第一次制作viewmodel,经过一些研究,我得到了以下代码:

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

        }
    }
}
CallerMemberName也给了我一个错误:

Type or namespace couldn't be found
作为一名一年级学生,制作viewmodel非常困难,我们将非常感谢您的帮助

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

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;您刚刚向编译器承诺,您将在类声明中:

ReservationVM : INotifyPropertyChanged
现在它让你信守诺言。要实现该特定接口,只需在viewmodel类中实现
PropertyChanged
事件,
ReservationVM
。这很简单,只需添加定义它的这一行:

public event PropertyChangedEventHandler PropertyChanged;
VisualStudio也将为您实现接口。右键单击顶部类声明中的接口名称,并从上下文菜单中选择“实现接口”(取决于VS版本,该版本可能位于“快速操作和重构”下)。您不想“显式地”实现,只需要常规的“实现”

一旦有了这个名称空间,就需要
CallerMemberNameAttribute
的名称空间。这也很快:

添加此行:

using System.Runtime.CompilerServices;
…到文件的顶部

我想提出的另一点是关于物业的命名。它不会破坏任何东西,但是您提出的公共/私有命名约定不是一个好主意。这是更常见的惯例:

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

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

您实际上没有实现INotifyPropertyChanged;您刚刚向编译器承诺,您将在类声明中:

ReservationVM : INotifyPropertyChanged
现在它让你信守诺言。要实现该特定接口,只需在viewmodel类中实现
PropertyChanged
事件,
ReservationVM
。这很简单,只需添加定义它的这一行:

public event PropertyChangedEventHandler PropertyChanged;
VisualStudio也将为您实现接口。右键单击顶部类声明中的接口名称,并从上下文菜单中选择“实现接口”(取决于VS版本,该版本可能位于“快速操作和重构”下)。您不想“显式地”实现,只需要常规的“实现”

一旦有了这个名称空间,就需要
CallerMemberNameAttribute
的名称空间。这也很快:

添加此行:

using System.Runtime.CompilerServices;
…到文件的顶部

我想提出的另一点是关于物业的命名。它不会破坏任何东西,但是您提出的公共/私有命名约定不是一个好主意。这是更常见的惯例:

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

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

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

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

public event PropertyChangedEventHandler PropertyChanged;
您的另一个错误是因为您没有为
CallerMemberName
添加名称空间。您可以通过与上面相同的方式从“使用”建议中获得它,或者将以下行添加到视图模型文件的顶部:

using System.Runtime.CompilerServices;

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

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

public event PropertyChangedEventHandler PropertyChanged;
您的另一个错误是因为您没有为
CallerMemberName
添加名称空间。您可以通过与上面相同的方式从“使用”建议中获得它,或者将以下行添加到视图模型文件的顶部:

using System.Runtime.CompilerServices;

到viewmodel或model类?@Gigitex viewmodel。说它正在实施的那个INotifyPropertyChanged@Gigitex你能在你的问题中粘贴新版本的代码吗?@Gigitex该代码实际上是正确的实现(线程安全,你的不是)啊,好吧,VS 2012使用“封装字段”实现了这一点。是的,我不会用它的。到viewmodel还是model类?@gigitexviewmodel。说它正在实施的那个INotifyPropertyChanged@Gigitex你能在你的问题中粘贴新版本的代码吗?@Gigitex该代码实际上是正确的实现(线程安全,你的不是)啊,好吧,VS 2012使用“封装字段”实现了这一点。是的,我不会用那个。