C# 设置数据上下文
我面临着下一个问题: 我有一个来自服务器的JSON文件,其中包含一些数据。我已经编写了一个类,它允许我反序列化JSON: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
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;
}
}
当它失败时,您会收到什么错误消息?我成功地赢得了这场战斗,我添加了私有变量