我第一次制作视图模型,经过一些研究,我得到了以下代码:
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
;你刚刚向编译器承诺,你会在类声明中,在这里:
ReservationVM : INotifyPropertyChanged
现在它让你信守承诺。要实现那个特定的接口,只需要在视图模型类ReservationVM
中实现PropertyChanged
事件。这很容易,只需添加定义它的行:
public event PropertyChangedEventHandler PropertyChanged;
Visual Studio也将为您实现接口。右键单击顶部类声明中的接口名称,然后从上下文菜单中选择"Implement interface"(取决于VS版本,可能位于"Quick Actions and Refractings"下)。您不希望实现"显式",只希望实现常规的"implement"。
一旦有了它,就需要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;