2017-04-26 13 views
1

キーが文字列の辞書と同じクラスの値のプロパティがあります。プロパティを更新すると自動的に値を更新するにはどうすればよいですか? viewmodelの辞書の値をプロパティに自動的に更新する

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

ここにあります関連セクション:

GPHDTModel gphdtModel = new GPHDTModel(); 

public MainWindowViewModel() 
{ 
    gphdtModel.MessageID = "3"; 
} 

ので、MessageIDの値を持つキー "メッセージID" はあります

はここでモデルクラスの関連するセクションです。 MessageIDを3に設定しましたが、辞書の値はnullのままです。私はOnPropertyChangedのイベントを使いこなし、ObservableDictionaryも実装しようとしましたが、運はありません。

+5

「プロパティを更新すると自動的に値を更新する方法はありますか?」 - プロパティセットを変更して辞書を更新するか、 'OnPropertyChanged'メソッドを代わりに行うようにします...しかし基本的には、' _fields ["MessageID"] = MessageID; 'またはそれと同等のものを呼び出す必要があります変更... –

+1

辞書に既に存在するキーを追加することはできません。したがって、あなたは_fields [key_name] = new valueで置き換えます。 – jdweng

答えて

2

コンストラクタでは、辞書に(nullである)現在のメッセージID を追加している:

_fields.Add("MessageID", MessageID); 

あなたがここにMessageIDプロパティの現在の値を追加していることに注意してください。これは、プロパティへのリンクのようなものを追加するようなものではありません。プロパティゲッタコールの結果のみを追加しています。プロパティ値が変更されると、辞書に格納されている値は変更されません。あなたのように辞書を使用します場合は、この同期を取り除くことができます

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

あなたは

public string MessageID 
{ 
    get { return _messageID; } 
    set 
    { 
     _messageID = value; 
     Fields["MessageID"] = value 
     OnPropertyChanged("MessageID"); 
    } 
} 
を行う必要があります10

理由:
_fields.Add("MessageID", MessageID);を実行したときに、その値が辞書に保存されましたが、リンクはそこにありませんでした。したがって、プロパティを更新すると、辞書の値は変わりません。

TBH、なぜこれを行う必要はありません。あなたはmvvmをタグ付けしているので、私はWPFを想定していますが、なぜこれをしなければならないのか分かりません。

関連する問題