C# 结构、事件和构造函数

病毒721

当您想要拥有一组值并在该集合更改时收到通知时,可以使用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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章