C# MVVM:为DataContract类成员引发PropertyChanged事件
我想为具有C# MVVM:为DataContract类成员引发PropertyChanged事件,c#,windows-phone-8,mvvm,datacontract,C#,Windows Phone 8,Mvvm,Datacontract,我想为具有DataContract的模型引发PropertyChanged事件。 最初我是这样做的 [DataContract] public partial class User : INotifyPropertyChanged { [DataMember(Name="username")] public string Username { get { return this.Username; }
DataContract
的模型引发PropertyChanged
事件。
最初我是这样做的
[DataContract]
public partial class User : INotifyPropertyChanged
{
[DataMember(Name="username")]
public string Username
{
get
{
return this.Username;
}
set
{
this.Username = value;
RaisePropertyChanged("Username");
}
}
}
这导致了StackOverflow异常,这是无限递归的原因
所以我想出的解决办法是
[DataContract]
public partial class User : INotifyPropertyChanged
{
private string _Username { get; set; }
[DataMember(Name="username")]
public string Username
{
get
{
return this._Username;
}
set
{
this._Username = value;
RaisePropertyChanged("Username");
}
}
}
虽然这反映了控件绑定到“Username”的Username值,但在我看来这并不是最好的方法。有点不对劲。另外,我的模型有大约30-40个字段。这是正确的方法还是有人能给我一个更好的建议
谢谢我很想在这里使用调用方成员名称(如果它在您的目标框架中):
[DataContract]
public partial class User : INotifyPropertyChanged
{
private string _Username;
[DataMember(Name="username")]
public string Username
{
get
{
return this._Username;
}
set
{
if(this._Username != value)
{
this._Username = value;
RaisePropertyChanged("Username");
}
}
}
}
我很想在这里使用调用方成员名(如果在您的目标框架中):
这通常是正确的方法。是的,有一些更为奇特的方式来发送通知,但您所做的现在还可以。您可以在私人成员分配之前删除此。。没有必要将
\u用户名
作为属性;这应该是一个领域。这通常是正确的方法。是的,有一些更为奇特的方式来发送通知,但您所做的现在还可以。您可以在私人成员分配之前删除此。。没有必要将\u用户名
作为属性;那应该是一个领域,谢谢。[CallerMemberName]在windows phone中不受支持。@这实际上取决于您使用的编译器;因为它完全是一个编译器特性(而不是框架特性),所以实际上您可以自己声明属性(在正确的名称空间中),如果您使用的是最新的编译器,它会工作的。[CallerMemberName]在windows phone中不受支持。@这实际上取决于您使用的编译器;因为它完全是一个编译器特性(而不是框架特性),所以实际上您可以自己声明属性(在正确的名称空间中),如果您使用的是最新的编译器,它就可以工作
private string _username;
[DataMember(Name="username")]
public string Username
{
get { return _username; }
set { SetField(ref _username, value); }
}
private void SetField<T>(ref T field, T value,
[CallerMemberName] string memberName = null)
{
if(!EqualityComparer<T>.Default.Equals(field,value))
{
field = value;
RaisePropertyChanged(memberName);
}
}
[DataMember(Name="username")]
public string Username
{
get { return this._Username; }
set { SetField(ref _Username, value, "Username"); }
}