首页 文章

可观察集合不更新列表框

提问于
浏览
-1

我使用可观察的集合作为我的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被调用,元素不为空)

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

还有什么办法可以将对集合的修改传播到列表框?

EDIT: 正如响应中所建议的,我在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,没有视觉变化 .

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

2 回答

  • 0

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

    相反,你需要 Binding (最好是在XAML中) .

    这将听取 ObservableColletionPropertyChanged 事件并相应地更新 ListBox .

  • 0

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

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

相关问题