2017-12-06 1 views
1

Ich falle in eine seltsame Situation, so muss ich im Wesentlichen eine Dictionary mit einer Zeichenfolge wie Key und ein benutzerdefiniertes Objekt wie Value erstellen. Die Dictionary haben diese Umsetzung:Kann Wert nicht auf Dictionary Key setzen

public static Dictionary<string, ForecastType> FullTime 
{ 
    get 
    { 
     return new Dictionary<string, ForecastType>() 
     { 
      { "1", new ForecastType { Type = SignType.PartialFinal, Sign = Signs.HomeHomePF } }, 
      ... 
     } 
    } 
} 

wie Sie ist der Schlüssel 1 sehen kann und der Wert ist eine benutzerdefinierte Klasse ForecastType genannt:

public class ForecastType : ViewModel 
{ 
    private double _value; 

    public double Value 
    { 
     get { return _value; } 
     set 
     { 
      _value = value; 
      OnPropertyChanged(); 
     } 
    } 

    public Signs Sign { get; set; } 
    public SignType Type { get; set; } 
} 

Eigentum Sign und Type keine explaination benötigen, es ist nur eine Implementierung eines Enum. Die Eigenschaft Value statt, verursacht mir eine Menge Kopfschmerzen. Insbesondere kann ich den Wert für diese Eigenschaft nicht festlegen, jeder Wert, den ich zuweisen, erhalte ich 0.

Ich implementierte auch die ViewModel, ich habe zu einem Problem auf PropertyChanged bezogen, aber auch dies hat die Situation nicht behoben.

I valorisieren die Value Eigenschaft auf diese Weise:

FullTime["1"].Value = 5; 

Beachten Sie, dass die OnPropertyChanged() korrekt genannt wird, und die value Inneren ist 5, aber, wenn ich es einen Haltepunkt, später die FullTime["1"].. Linie I wie erhalten .Value "0".

Was mache ich falsch?

Danke für jede Hilfe. Freundliche Grüße.

+5

Weil Ihre Fulltime-Eigenschaft ein neues Wörterbuch zurückgibt Im get werden Änderungen, die Sie daran vornehmen, nicht beibehalten, da das Objekt jedes Mal neu erstellt wird, wenn Sie es aufrufen. –

+0

@ JonathonChase oh, das ist richtig, gutes Auge! Aber leider muss ich ein "Dictionary" von dieser Eigenschaft zurückgeben – pivutali

+1

Erstellen Sie ein neues Wörterbuch im Konstruktor, dann zurück, dass über 'get' –

Antwort

1

Statt die Getter für die FullTime Eigenschaft, dass es ein neues Wörterbuch zurückzukehren, können Sie, wie von C 6 #, bieten einen Standardwert für die Eigenschaft wie folgt:

public static Dictionary<string, ForecastType> FullTime {get;} = new Dictionary<string, ForecastType>() { /* initial dictionary values go here */ }; 
+0

Das hat für mich funktioniert! Vielen Dank :) – pivutali

1

Ihre FullTime hat nur einen Getter, die immer dann, wenn ein neuen Wörterbuch mit dem Standardwert von ForecastType.Value aufgerufen wird zurückgibt. Eine mögliche Lösung es die folgende wäre:

public static Dictionary<string, ForecastType> FullTime { get; } = 
    new Dictionary<string, ForecastType> 
    { 
     { "1", new ForecastType 
      { 
       Type = SignType.PartialFinal, 
       Sign = Signs.HomeHomePF 
      } 
     // ... 
    }; 

Der Unterschied ist, dass jetzt die Sie erstellen haben eine Eigenschaft mit nur einem Getter aber mit einem Standardwert, die nicht verändert werden können. Dieser Wert ist eine Referenz auf ein Wörterbuch Dictionary<string, ForecastType>. Wenn Sie den Wert dieser Eigenschaft lesen, erhalten Sie den gleichen Verweis, aber jetzt können Sie den Status des Objekts ändern, auf das dieser Verweis verweist, indem Sie dem Wörterbuch neue Elemente hinzufügen, Werte ändern usw.

2

Das Problem ist in die FullTime Eigenschaft selbst. Es immer wieder ein neue Wörterbuch:

get 
{ 
    return new Dictionary<string, ForecastType>() {...}; 
} 

Jedes Mal, wenn Sie es nennen, ob oder sich etwas setzen in das Wörterbuch sind Sie immer ein ganz neues Wörterbuch zu bekommen. Kein Wörterbuch wird jemals im Speicher gespeichert.

Speichern Sie eine Instanz in der Klasse und geben Sie stattdessen diese Instanz zurück.so etwas wie dies vielleicht:

private static Dictionary<string, ForecastType> _myDict; 

public static Dictionary<string, ForecastType> FullTime 
{ 
    get 
    { 
     if (_myDict == null) 
      _myDict = new Dictionary<string, ForecastType>() {...}; 
     return _myDict; 
    } 
} 

Auf diese Weise wird es das erste Mal, wenn Sie diese Eigenschaft nennen initialisiert werden, und alle nachfolgenden Anrufe an diese Eigenschaft wird das zuvor initialisiert Wörterbuch ergeben.

Verwandte Themen