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