我陷入了一种奇怪的境地,所以基本上我需要创建一个Dictionary
,其字符串为Key
,自定义对象为Value
。 Dictionary
有这个实现:
public static Dictionary<string, ForecastType> FullTime
{
get
{
return new Dictionary<string, ForecastType>()
{
{ "1", new ForecastType { Type = SignType.PartialFinal, Sign = Signs.HomeHomePF } },
...
}
}
}
你可以看到密钥是1
,而值是一个名为ForecastType
的自定义类:
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; }
}
属性Sign
和Type
不需要解释,它只是Enum
的实现。
相反,属性Value
让我很头疼。特别是我无法将值设置为此属性,我指定的每个值都得到0
。
我还实施了ViewModel
,我虽然遇到了与PropertyChanged
相关的问题,但即使这样也没有解决问题。
我以这种方式对Value
属性进行了增值:
FullTime["1"].Value = 5;
请注意,OnPropertyChanged()
被正确调用,其中的value
为5
,但是当我设置断点时,后来FullTime["1"]..
行获得{ {1}}“0”。
我做错了什么?
感谢您的帮助。最好的祝福。
答案 0 :(得分:2)
问题出在FullTime
属性本身。 始终会返回新字典:
get
{
return new Dictionary<string, ForecastType>() {...};
}
每当你打电话给它时,无论是在 字典中设置或获取任何内容,你都会得到一本全新的字典。内存中没有字典。
在类中保存一个实例,然后返回那个实例。也许是这样的:
private static Dictionary<string, ForecastType> _myDict;
public static Dictionary<string, ForecastType> FullTime
{
get
{
if (_myDict == null)
_myDict = new Dictionary<string, ForecastType>() {...};
return _myDict;
}
}
这样,它将在您第一次调用该属性时进行初始化,对该属性的任何后续调用都将生成以前初始化的字典。
答案 1 :(得分:1)
您的FullTime
只有一个getter,无论何时调用都会返回一个 new 字典,其默认值为ForecastType.Value
。一种可能的解决方案如下:
public static Dictionary<string, ForecastType> FullTime { get; } =
new Dictionary<string, ForecastType>
{
{ "1", new ForecastType
{
Type = SignType.PartialFinal,
Sign = Signs.HomeHomePF
}
// ...
};
不同之处在于,现在您创建的属性仅包含getter 但具有默认值,无法更改。此值是对字典Dictionary<string, ForecastType>
的引用。每当您读取此属性的值时,您将获得相同的引用,但现在您可以通过向字典添加新项,更改值等来改变此引用指向的对象的状态。
答案 2 :(得分:1)
不是让FullTime
属性的getter返回一个新的字典,你可以从C#6开始为这个属性提供一个默认值:
public static Dictionary<string, ForecastType> FullTime {get;} = new Dictionary<string, ForecastType> () { /* initial dictionary values go here */ };