- 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 的 ViewModel s 绑定(bind)为 ItemsSource s 到两个不同的 ListBox es。两者包装相同 ObservableCo
删除绑定(bind)集合中的所有项目后,datagrid.items.count为1,项目集合中唯一的项目是newitemplaceholder,但datagrid不显示newitemplacehol
所以我正在开发一个带有在应用程序(主应用程序)中使用的 UI 的插件。为了在主应用程序工作时使我的 UI 响应,我在其单独的线程中启动我的 UI,如下所示: public void Show
我有一个 ObservableCollection 项目,我需要能够更新它并仍然使用 ICollectionView 来表示数据。 以下是相关代码: private ObservableCollect
这个问题在这里已经有了答案: How do I update an ObservableCollection via a worker thread? (7 个答案) 关闭 2 年前。 我有一个 D
在 Visual Studio 2017 中,尝试存档 Xamarin Android 项目时,成功构建后出现以下错误: 无法创建应用程序存档“MyArchive”。这种类型的 CollectionV
这是我在尝试存档我的应用程序以进行部署时遇到的错误。 此错误不会在任何其他时间出现。该项目在模拟器和设备上构建和运行没有问题。该错误的上下文或方向为零,不知道在哪里可以修复它。它也只是随机出现,上
我是一名优秀的程序员,十分优秀!