MVVM:为DataContract类成员引发PropertyChanged事件

时间:2014-08-21 12:38:30

标签: c# windows-phone-8 mvvm datacontract

我想为PropertyChanged的模型举起DataContract个事件。 最初我做了这个

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

虽然这反映了绑定到"用户名"的控件的用户名值,但这对我来说并不是最好的方式。出了点问题。我的模型也有大约30-40个字段。这是正确的方法还是有人可以建议我一个更好的方法。

谢谢

2 个答案:

答案 0 :(得分:3)

我很想在这里使用caller-member-name(如果它在你的目标框架中):

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

如果不支持caller-member-name:

[DataMember(Name="username")]
public string Username
{
    get { return this._Username; }
    set { SetField(ref _Username, value, "Username"); }
}

答案 1 :(得分:2)

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