我有点奇怪的情况,我已经实现了一个 ObservableConcurrentDictionary (基于.NET的 ConcurrentDictionary ),我用它来实现 ObservableConcurrentCollection (它只是自动设置Dictionary中的Key属性,并具有所有IList,IEnumerable,IQueryable和ICollection方法)。当我做类似的事情时,这一切都很好。
ObservableConcurrentCollection<string> items = new ObservableConcurrentCollection<string>();
dataGrid.ItemsSource = items;
items.Add("TEST");
这完全反映在DataGrid中。
然而,当我这样做时:
ObservableConcurrentCollection<string> items = new ObservableConcurrentCollection<string>();
items.Add("TEST"); // <-- Notice that this and the line below are swapped.
dataGrid.ItemsSource = items;
由于“项目”中的项目突然变为KeyValuePair,因此无法正常工作。我可以通过在最后一行使用dataGrid.ItemsSource = items.Values来轻松解决这个问题,但我宁愿让它像上一行一样工作(而且它也令人困惑)。
答案 0 :(得分:0)
由于您的新ObservableConcurrentDictionary类基于ConcurrentDictionary,我怀疑问题是在其中一个接口方法的实现中。
如果没有看到该类,则很难诊断,但我怀疑问题出在其中一个检索实现中,它返回整个字典条目而不是键指定的值。
例如,当ItemsSource在第二种情况下绑定到网格时,它可以通过IEnumerable检索值,而在第一种情况下调用Add时,它会触发包含正确信息的可观察事件。
通过在可疑检索方法中放置断点或在第二种情况下插入代码时,应该非常直接地找出问题发生的位置,因为ItemsSource正在被分配。这应该可以很快地向您显示正在执行的方法,并显示正在返回字典条目而不是值。
答案 1 :(得分:0)
对我来说,我总是使用这个
<DataGrid ItemsSource="{Binding}" x:Name="datagrid" >
然后
ObservableConcurrentCollection<string> items = new ObservableConcurrentCollection<string>();
items.Add("TEST");
dataGrid.DataContext = items;
你可以尝试这个,即使我交换了我的行,也可以为我工作
答案 2 :(得分:0)
通过更改ObservableConcurrentCollection解决了这个问题,我删除了继承并为ObservableConcurrentDictionary创建了一个字段。现在就像一个魅力。