C# 设置数据上下文

C# 设置数据上下文,c#,json,data-binding,windows-8,datacontext,C#,Json,Data Binding,Windows 8,Datacontext,我面临着下一个问题: 我有一个来自服务器的JSON文件,其中包含一些数据。我已经编写了一个类,它允许我反序列化JSON: public class Person : INotifyPropertyChanged { //public event PropertyChangedEventHandler PropertyChanged; public int? version { get; set; } public int? id { get; set; } pub

我面临着下一个问题:

我有一个来自服务器的JSON文件,其中包含一些数据。我已经编写了一个类,它允许我反序列化JSON:

public class Person : INotifyPropertyChanged
{
    //public event PropertyChangedEventHandler PropertyChanged;
    public int? version { get; set; }
    public int? id { get; set; }
    public string name { get; set; }
    public bool? isNeeded { get; set; }

    //protected void OnPropertyChanged(string name)
    //{
    //    PropertyChangedEventHandler handler = PropertyChanged;
    //    if (handler != null)
    //    {
    //        handler(this, new PropertyChangedEventArgs(name));
    //    }
    //}
}
我有一个自定义控件,我将DataContext设置为Person-binding,但我希望控件在某些字段(1个或多个)被修改时做出反应

1)是否必须写入每个属性的属性更改?

我成功地写下了这样的话:

public class Person : INotifyPropertyChanged
{
    private string _name;
    public event PropertyChangedEventHandler PropertyChanged;
    public int? version { get; set; }
    public int? id { get; set; }
    public string name 
    {
        get { return _name; }
        set
        {
            _name = value;
            OnPropertyChanged("name");
        }
    }
    public bool? isNeeded { get; set; }

    protected void OnPropertyChanged(string _name)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(_name));
        }
    }
}
但问题是我是否应该为每个属性创建私有变量,是否应该为每个属性编写EventChanged?或者有一个更简单的方法?

找到了这个解决方案:

public class Person : INotifyPropertyChanged
{
private string _name;
private int? _version;
public event PropertyChangedEventHandler PropertyChanged;
public int? version 
    {
        get { return _version; }
        set { SetField(ref _version, value, "version"); }
    }
public int? id { get; set; }
public string name 
    {
        get { return _name; }
        set { SetField(ref _name, value, "name"); }

    }
public bool? isNeeded { get; set; }

protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
    protected bool SetField<T>(ref T field, T value, string propertyName)
    {
        if (EqualityComparer<T>.Default.Equals(field, value)) return false;
        field = value;
        OnPropertyChanged(propertyName);
        return true;
    }

}
公共类人员:INotifyPropertyChanged
{
私有字符串\u名称;
私有int?\u版本;
公共事件属性更改事件处理程序属性更改;
公共int?版本
{
获取{return\u version;}
set{SetField(ref _version,value,“version”);}
}
公共int?id{get;set;}
公共字符串名
{
获取{return\u name;}
set{SetField(ref{u name,value,“name”);}
}
需要公共布尔值{get;set;}
受保护的虚拟void OnPropertyChanged(字符串propertyName)
{
PropertyChangedEventHandler处理程序=PropertyChanged;
if(handler!=null)handler(这是新的PropertyChangedEventArgs(propertyName));
}
受保护的布尔设置字段(参考T字段、T值、字符串属性名称)
{
if(EqualityComparer.Default.Equals(字段,值))返回false;
字段=值;
OnPropertyChanged(propertyName);
返回true;
}
}

当它失败时,您会收到什么错误消息?我成功地赢得了这场战斗,我添加了私有变量