我使用可观察的集合作为我的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 回答
在您的代码中,您只需设置
ItemSource
一次 . 没有跟踪变化的机制 .相反,你需要 Binding (最好是在XAML中) .
这将听取
ObservableColletion
的PropertyChanged
事件并相应地更新ListBox
.很好,毕竟这只是由Resharper引起的一个愚蠢的错误 . 它决定从SharpDX.Collections而不是System.Collections.ObjectModel导入ObservableCollection . 我在检查CollectionChanged事件的订阅时意识到这一点,并且没有CollectionChanged事件 .
也不需要绑定 . 将代码中的
ItemsSource
设置为私有字段并修改该集合就像魅力(就像绑定一样) .