制作视图模型错误
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;
我是第一次制作视图模型,经过一番研究,我得到了以下代码:
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;