- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个包含两个 ICollectionView
的 ViewModel s 绑定(bind)为 ItemsSource
s 到两个不同的 ListBox
es。两者包装相同 ObservableCollection
,但具有不同的过滤器。最初一切正常,两个列表框都显示正确填充。
但是,当我更改 ObservableCollection 中的项目并修改与过滤相关的属性时,ListBoxes 不会更新。在调试器中,我发现两个 ICollectionVIews 的 SourceCollection 都是空的,尽管我的 ObservableCollection 仍然存在。
这是我修改项目的方式,通过删除和添加相同的项目确保更新 ICollectionViews:
private void UnassignTag(TagViewModel tag)
{
TrackChangedTagOnCollectionViews(tag, t => t.IsAssigned = false);
}
private void TrackChangedTagOnCollectionViews(TagViewModel tag, Action<TagViewModel> changeTagAction)
{
_tags.Remove(tag);
changeTagAction.Invoke(tag);
_tags.Add(tag);
}
该机制在我使用相同类的另一个上下文中工作。
我还意识到,如果我在 ICollectionViews 的 CollectionChanged 事件上注册监听器,问题就会消失。我确保我从 GUI 线程创建和修改它们并怀疑垃圾收集是问题所在,但目前我被卡住了......想法?
更新:
调试时我意识到 SourceCollections 在我调用 ShowDialog()
之前仍然存在在承载我的 UserControl 的 WinForms 窗体上。当显示对话框时,它们就消失了。
我这样创建 ICollectionViews:
AvailableTags = new CollectionViewSource { Source = _tags }.View;
AssignedTags = new CollectionViewSource { Source = _tags }.View;
这是我绑定(bind)两者之一的方法(另一个非常相似):
<ListBox Grid.Column="0" ItemsSource="{Binding AvailableTags}" Style="{StaticResource ListBoxStyle}">
<ListBox.ItemTemplate>
<DataTemplate>
<Border Style="{StaticResource ListBoxItemBorderStyle}">
<DockPanel>
<Button DockPanel.Dock="Right" ToolTip="Assign" Style="{StaticResource IconButtonStyle}"
Command="{Binding Path=DataContext.AssignSelectedTagCommand, RelativeSource={RelativeSource AncestorType={x:Type tags:TagsListView}}}"
CommandParameter="{Binding}">
<Image Source="..."/>
</Button>
<TextBlock Text="{Binding Name}" Style="{StaticResource TagNameTextBlockStyle}"/>
</DockPanel>
</Border>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
我使用 MvvmLight 的 RelayCommand<T>
作为ICommand
在我的 ViewModel 中实现:
AssignSelectedTagCommand = new RelayCommand<TagViewModel>(AssignTag);
最佳答案
我也有这个问题,有类似的用例。当我更新基础集合时,我会在所有过滤的 View 上调用 Refresh()
。有时,这会导致从 ListCollectionView.PrepareLocalArray()
中抛出 NullReferenceException
,因为 SourceCollection
为 null。
问题是您不应绑定(bind)到 CollectionView
,而应绑定(bind)到 CollectionViewSource.View
属性。
这是我的做法:
public class ViewModel {
// ...
public ViewModel(ObservableCollection<ItemViewModel> items)
{
_source = new CollectionViewSource()
{
Source = items,
IsLiveFilteringRequested = true,
LiveFilteringProperties = { "FilterProperty" }
};
_source.Filter += (src, args) =>
{
args.Accepted = ((ItemViewModel) args.Item).FilterProperty == FilterField;
};
}
// ...
public ICollectionView View
{
get { return _source.View; }
}
// ...
}
关于c# - ICollectionView 的 SourceCollection 为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28435477/
我不明白为什么我的 ICollectionView 没有刷新。谁能解释我做错了什么? 我做了这样一个 View 模型: class ViewModel : INotifyPropertyChanged
有什么办法吗 ICollectionView.Refresh() 或者 CollectionViewSource.GetDefaultView(args.NewValue).Refresh(); 在
我已经编写了用于在 ComboBox 中过滤项目的代码: 我的问题是,你会怎么做? 我认为这个带有反射的解决方案可能会非常慢.. ICollectionView view = CollectionVi
我有一个 ObservableCollection : public ObservableCollection Collection { get; set; } = new ObservableCol
ImageAlbums是一个 ICollectionView类型和 GlobalCollection.MyImageAlubms是一个 ObservableCollection类型。 ImageAlb
也许有人可以帮助我?我有以下场景: 一个简单的 View : Refresh 背后的代码: publ
我有 3 个级联 ICollectionView s 在我的 View 模型中,其中一个依赖于另一个。 第一个不绑定(bind)到 View 上的控件,而是用作两个即将出现的作为主细节显示给用户的键过
我正在尝试在 WPF 中实现 MVVM 模式。我关注了 Jeremy Alles 的 Very simple MVVM demo application 。我有一个 ListBox,它绑定(bind)
我在我的 View 模型中将一个 ListView 绑定(bind)到一个 ICollectionView。 ICollectionView 有一些预定义的过滤器,当您单击某些按钮时会应用这些过滤器。
我有一个类 Class ABC() { public string Name{get;set;} public string Category{get;set;} } 由此类形成的列表
我创建了一个小型用户控件,其中包含一个 ICollectionView 和一个 ObservableCollection。 ObservableCollection messages; public
我有一个名为 ItemType 的对象的集合,每个集合都有一个 Item 的子集合。顶级集合被包装到一个 ObservableCollection 中,因此它会在用户从集合中添加或删除内容时做出响应。
我有一个使用 Entity Framework 查询数据库并将结果放在 ICollectionView 中的方法。 ICollectionView 充当 DataGrid 的 ItemsSource。
有什么方法可以自动更新 ICollectionView 上的过滤器,而无需在进行相关更改时调用 Refresh()? 我有以下内容: [Notify] public ICollectionView W
如何在 C# 中从 ICollectionView 中删除项目? Dictionary entityDict; public ICollectionView DictView { get; set;
我有一个 .Net 4.5 应用程序正在迁移到基于 WPF 的 RxUI(在撰写本文时保持最新,6.0.3)。我有一个文本字段,它应该用作具有相当常见的 throttle 等的过滤器字段,这些东西首先
所以我有一个数据网格,我需要为其添加自定义排序,我还需要知道排序的确切顺序。 我已阅读,为了做到这一点,我需要实现自定义 icollectionview 并将其绑定(bind)到数据网格。 我遇到的问
我有 ICollectionView 看起来像 public ICollectionView UsersCollectionView { get { var view
我将 ObservableCollection 绑定(bind)到 dataGrid,现在我想过滤显示的数据 我发现我需要使用 ICollectionView 但我不确定如何使用我的 MVVM 模式添
我是WPF的新手,看起来我也不完全理解C#。 下面的代码应该向 DataGrid 提供排序后的数据。 这是我难以理解的代码: ObservableCollection PersonsCollectio
我是一名优秀的程序员,十分优秀!