当您想要拥有一组值并在该集合更改时收到通知时,可以使用ObservableCollection
和它的CollectionChanged
事件。
但是,它的CollectionChanged
事件仅在修改集合本身时才会触发,而不是它包含的值。例如,如果我有一个ObservableCollection<Image>
,我将无法检测到何时有人访问了集合的第 N 个图像并调用了修改它的方法。如果我有一个ObservableCollection<Color>
. 如果我希望能够监视列表中包含的 Color 结构何时被分配,则项目本身必须是可观察的(递归)。一个Color
不可观察的结构,我想将它封装到一个名为ObservableColor
.
问题是,编译器对我大喊大叫,因为该事件没有在构造函数中初始化。首先我不知道必须初始化一个事件,其次我不知道它应该如何初始化。
下面是我的代码:
struct ObservableColor : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public Color Value { get; private set; }
public ObservableColor(Color color)
{
Value = color;
}
public void Set(Color color)
{
Color oldColor = Value;
Value = color;
if (Value != oldColor)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Value"));
}
}
}
我怎样才能使这个编译?谢谢你。
C# 要求在值类型的构造函数中显式初始化所有字段。您收到此错误只是因为PropertyChanged
在构造函数完成之前未分配任何内容。解决这个问题很简单,只需这样做:
public ObservableColor(Color color)
{
Value = color;
PropertyChanged = null;
}
也就是说,你应该考虑改变你的方法。可变结构是各种令人头疼的问题、意想不到的行为和可能让你发疯的微妙错误的根源。我建议更改ObservableColor
为引用类型。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句