可观察集合不更新列表框

时间:2015-02-19 10:08:25

标签: c# wpf listbox observablecollection

我使用可观察的集合作为我的WPF列表框的项目源。在代码中,这意味着:

private readonly ObservableCollection<AssetBrowserFilePreviewElement> mLastElements; // = new ...

private void OnInitialized(object sender, EventArgs args)
{
    mBrowser.SelectedFilesListView.ItemsSource = mLastElements;
}

// in another method:
mLastElements.Clear();
foreach(var elem in elements)
    mLastElements.Add(elem);

(OnInitialized被调用,元素不为空)

正如标题中所写,我的问题是从集合中添加和删除项目对列表框完全没有影响,它始终保持为空。如果我将IEnumerable<AssetBrowserFilePreviewElement> elements绑定为ItemsSource而不是此Clear和Add循环,则会得到预期的结果。在这种情况下它会以这种方式工作,但在其他方法中我想有选择地删除或添加项目,因此我需要可观察的集合才能工作。

我还需要做些什么才能将对集合的修改传播到列表框?

修改 正如响应中所建议的,我在XAML中创建了一个属性和绑定,但仍然没有任何响应。

XAML:

<ListBox Padding="10,10,10,10" x:Name="SelectedFilesListView" Grid.Row="1" ItemsSource="{Binding Path=CurrentFiles}">

C#:

private readonly ObservableCollection<AssetBrowserFilePreviewElement> mCurFiles = new ObservableCollection<AssetBrowserFilePreviewElement>();
public ObservableCollection<AssetBrowserFilePreviewElement> CurrentFiles { get { return mCurFiles; } }


CurrentFiles.Clear();
foreach(var elem in elements)
    CurrentFiles.Add(elem);

当控件加载时,将调用CurrentFiles getter。调用集合的方法也被调用,elements.Count == 18,没有视觉变化。

编辑2: 我在AssetBrowserViewModel的构造函数中添加了一个测试元素到CurrentFiles(其中定义了Property,并将其设置为DataContext)。此项目显示,但修改集合的元素会持续显示该测试元素。

2 个答案:

答案 0 :(得分:0)

在您的代码中,您只需设置一次ItemSource即可。没有跟踪变化的机制。

相反,您需要绑定(最好是在XAML中)。

这会收听PropertyChanged的{​​{1}}个事件并相应地更新ObservableColletion

答案 1 :(得分:0)

很好,毕竟这只是Resharper造成的一个愚蠢的错误。它决定从SharpDX.Collections而不是System.Collections.ObjectModel导入ObservableCollection。我在检查CollectionChanged事件的订阅时意识到这一点,并且没有CollectionChanged事件。

也不需要绑定。将代码中的ItemsSource设置为私有字段并修改该集合就像魅力(就像绑定一样)。