Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何订阅从C#中的任何集合元素激发的事件?_C#_Dictionary_Events - Fatal编程技术网

如何订阅从C#中的任何集合元素激发的事件?

如何订阅从C#中的任何集合元素激发的事件?,c#,dictionary,events,C#,Dictionary,Events,我制作了以下字典,我希望能够订阅从其任何元素激发的事件,以便知道哪些字典元素的属性已更改 这是我的班级: public class BlockInput : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; public void NotifyPropertyChanged(string PropertyName) { PropertyC

我制作了以下字典,我希望能够订阅从其任何元素激发的事件,以便知道哪些字典元素的属性已更改

这是我的班级:

public class BlockInput : INotifyPropertyChanged
{

    public event PropertyChangedEventHandler PropertyChanged;

    public void NotifyPropertyChanged(string PropertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(PropertyName));
    }

    private int _value;
    public int Value
    {
        get
        {
            return _value;
        }
        set
        {
            _value = Value;
            NotifyPropertyChanged("Value");
        }
    }
}
我创建了一个并发字典,如下所示:

  public ConcurrentDictionary<string, BlockInput> Inputs;
公共ConcurrentDictionary输入;
如何实现这一点,以便我在每次触发每个元素的一个BlockInput值发生更改/事件时都能找到


谢谢您的时间。

我认为您除了自己手动订阅所有活动外,没有其他方法:

foreach(Inputs.Values中的BlockInput项){
item.PropertyChanged+=块输入_PropertyChanged;
}
private void BlockInput\u PropertyChanged(对象发送方,PropertyChangedEventArgs e){
var blockInput=sender as blockInput;//获取已更改的项
//做事
}

如果您计划在实际使用此界面(主要是MVVM)时从
字典中添加或删除项目,则您必须订阅所有添加的项目,并取消订阅已删除的项目。通常这就足够了。您让GUI类完成订阅事件的所有管道工作。您只需提供3个更改通知:

  • 块输入的每个属性之一。您在示例代码中做到了这一点
  • 如果从集合中添加或删除了某些内容,则为。这就是
    observateCollection
    将要解决的问题。这也是组委会唯一要处理的事情
  • 属性上公开
    可观察集合的那一个。OC在批量修改方面是出了名的糟糕,所以通常需要在代码中准备一个新实例,而公开是最后一步
  • 如果您没有MVVM用例,请留下评论。除了手动订阅每个事件外,我可以想出两种方法