我有一个字典,其中键是字符串,而value属性在同一个类中。更新属性时如何自动更新值?
以下是模型类的相关部分:
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"); }
}
以下是viewmodel的相关部分:
GPHDTModel gphdtModel = new GPHDTModel();
public MainWindowViewModel()
{
gphdtModel.MessageID = "3";
}
所以,有一个关键的“MessageID”,其值为MessageID
。我将MessageID
设置为3,但字典中的值保持为空。我已经搞砸了OnPropertyChanged
事件,并试图实现ObservableDictionary
,但没有运气。
答案 0 :(得分:2)
在构造函数中,您将当前消息ID value (为空)添加到字典中:
_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");
}
}
答案 1 :(得分:1)
你需要做
public string MessageID
{
get { return _messageID; }
set
{
_messageID = value;
Fields["MessageID"] = value
OnPropertyChanged("MessageID");
}
}
<强>原因:强>
当您执行_fields.Add("MessageID", MessageID);
时,您将值存储在字典中,但链接不存在。因此,当您更新属性时,字典中的值保持不变。