C# 自动更新设置为属性的字典值
我有一个字典,其中键是字符串,值属性在同一个类中。更新属性时如何自动更新值 以下是模型类的相关部分:C# 自动更新设置为属性的字典值,c#,dictionary,mvvm,C#,Dictionary,Mvvm,我有一个字典,其中键是字符串,值属性在同一个类中。更新属性时如何自动更新值 以下是模型类的相关部分: private Dictionary<string, string> _fields = new Dictionary<string, string>(); public Dictionary<string, string> Fields { get { return _fields; } } public GPHDT
private Dictionary<string, string> _fields = new Dictionary<string, string>();
public Dictionary<string, string> Fields
{
get
{
return _fields;
}
}
public GPHDTModel()
{
_fields.Add("MessageID", MessageID);
}
private string _messageID;
public string MessageID
{
get { return _messageID; }
set { _messageID = value; OnPropertyChanged("MessageID"); }
}
因此,有一个值为
MessageID
的键“MessageID”。我将MessageID设置为3,但字典中的值保持为空。我处理了OnPropertyChanged
事件,并尝试实现了ObservableDictionary
,但没有成功。在构造函数中,您正在将当前消息id值(为null)添加到字典中:
_fields.Add("MessageID", MessageID);
您应该注意,您正在此处添加MessageID
属性的当前值。这与向属性添加类似链接的内容不同。您只添加属性getter调用的结果。如果属性值将更改,则不会修改字典中存储的值
要同步存储在属性和字典中的值,您还应在修改属性时更新字典:
private string _messageID;
public string MessageID
{
get { return _messageID; }
set {
_messageID = value;
_fields["MessageID"] = value; // here
OnPropertyChanged("MessageID");
}
}
如果将字典用作属性的备份存储,则可以取消此同步:
public GPHDTModel()
{
_fields.Add("MessageID", null); // initialize with default value
}
public string MessageID
{
get { return _fields["MessageID"]; }
set {
if (_fields["MessageID"] == value)
return;
_fields["MessageID"] = value;
OnPropertyChanged("MessageID");
}
}
你需要做什么
public string MessageID
{
get { return _messageID; }
set
{
_messageID = value;
Fields["MessageID"] = value
OnPropertyChanged("MessageID");
}
}
原因:当您执行
\u fields.Add(“MessageID”,MessageID)代码>,您将值存储在字典中,但链接不在那里。因此,当您更新属性时,字典中的值保持不变
我不明白你为什么要这么做。因为您已经标记了mvvm,所以我假设使用WPF,但我仍然无法理解您为什么要这样做。“我如何在更新属性时自动更新值?”-您可以更改属性设置器以更新字典,或者让您的OnPropertyChanged
方法改为这样做。。。但基本上,需要调用\u字段[“MessageID”]=MessageID每次更改代码>或等效项时…不能添加字典中已存在的键。因此,您将替换为_字段[key_name]=新值;
public string MessageID
{
get { return _messageID; }
set
{
_messageID = value;
Fields["MessageID"] = value
OnPropertyChanged("MessageID");
}
}