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