我使用可观察的集合作为我的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)。此项目显示,但修改集合的元素会持续显示该测试元素。
答案 0 :(得分:0)
在您的代码中,您只需设置一次ItemSource
即可。没有跟踪变化的机制。
相反,您需要绑定(最好是在XAML中)。
这会收听PropertyChanged
的{{1}}个事件并相应地更新ObservableColletion
。
答案 1 :(得分:0)
很好,毕竟这只是Resharper造成的一个愚蠢的错误。它决定从SharpDX.Collections而不是System.Collections.ObjectModel导入ObservableCollection。我在检查CollectionChanged事件的订阅时意识到这一点,并且没有CollectionChanged事件。
也不需要绑定。将代码中的ItemsSource
设置为私有字段并修改该集合就像魅力(就像绑定一样)。