C# 生成viewmodel错误
我是第一次制作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
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使用“封装字段”实现了这一点。是的,我不会用那个。