更新自动设置为属性的字典值

时间:2017-04-26 14:32:52

标签: c# dictionary mvvm

我有一个字典,其中键是字符串,而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,但没有运气。

2 个答案:

答案 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);时,您将值存储在字典中,但链接不存在。因此,当您更新属性时,字典中的值保持不变。

TBH,我不明白你为什么要这样做。既然你已经标记了mvvm所以我假设WPF,但我仍然无法理解为什么你必须这样做。