在添加项目之前或之后设置ItemsSource更改对象?

时间:2012-08-05 18:07:31

标签: c# wpf data-binding binding itemssource

我有点奇怪的情况,我已经实现了一个 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来轻松解决这个问题,但我宁愿让它像上一行一样工作(而且它也令人困惑)。

3 个答案:

答案 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创建了一个字段。现在就像一个魅力。