- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
C#:
public partial class MainWindow : Window
{
private readonly ViewModel vm;
public MainWindow()
{
InitializeComponent();
vm = new ViewModel();
DataContext = vm;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
vm.Models.RemoveAt(0);
}
}
public class ViewModel
{
public ObservableCollection<Model> Models { get; set; }
public ListCollectionView View { get; set; }
public ViewModel()
{
Models = new ObservableCollection<Model>()
{
new Model() { Name = "Gordon Freeman" },
new Model() { Name = "Isaac Kleiner" },
new Model() { Name = "Eli Vance" },
new Model() { Name = "Alyx Vance" },
};
Models.CollectionChanged += (s, e) => View.Refresh();
View = new ListCollectionView(Models);
}
}
public class Model
{
public string Name { get; set; }
public override string ToString()
{
return Name;
}
}
XAML:
<StackPanel>
<ListBox ItemsSource="{Binding Path=View}" />
<Button Click="Button_Click">Click</Button>
</StackPanel>
ObservableCollection 包含 4 个元素,而 ListBox 显示所有 4 个元素,正如预期的那样。单击按钮时,ObservableCollection 的第一个元素将被删除。然而,ListBox 现在只显示第 2 和第 3 个。看起来第 1 和第 4 已被删除。
如果行 Models.CollectionChanged += (s, e) => View.Refresh();
被移动到之后 View = new ListCollectionView(Models );
(或完全注释掉)一切按预期工作。
为什么?
附言这是一个更大拼图的简单部分。在这个小示例中,我意识到我不需要在 CollectionChanged 上调用 View.Refresh();
来让 ListBox 自行更新。
最佳答案
我的猜测是刷新会干扰 View 的自动更新。据推测, View 也在构造函数中订阅了 CollectionChanged
,因此如果您还在 View 之前订阅了事件并调用刷新,那么您会在集合更改和 View 自身的更新之间获得不需要的更新。
例如
项目 0 已删除 -> 通知事件监听器
=> 您的处理程序:Refresh() -> 重建 View => 项目被删除。
=> 查看处理程序:事件参数说:项目 X 已删除 -> 删除项目 X
这仍然不能解释为什么第一个和最后一个项目被删除,但对我来说这似乎是合理的。
如果订阅在 View 实例化之后:
项目 0 已删除 -> 通知事件监听器
=> 查看处理程序:事件参数说:项目 X 已删除 -> 删除项目 X
=> 您的处理程序:Refresh() -> 重建 View => 没有任何改变。
关于c# - 通过 ListCollectionView 的 ObservableCollection 显示不正确的项目列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8808575/
我有一个 ObservableCollection 和一个 ListCollectionView 并带有一个 Filter 谓词集。当我更改全局条件时,比如说搜索文本,我可以在 View 上调用 .R
这个问题在这里已经有了答案: Should I bind to ICollectionView or ObservableCollection (5 个答案) 关闭 8 年前。 我无意中发现了 Li
我一直在研究如何避免因 View 模型中对 INotifyCollectionChanged 事件的强引用而导致的内存泄漏。我正在尝试使用 ListCollectionView 看看它是否适合我。我认
ListCollectionView.AddNew如何确定它创建的对象的类型,以及如何影响它? 我有几种类型的层次结构( Base 、 DerivedA 和 DerivedB ),目前我的 WPF 工
我正在使用 MVVM 设计模式,ListView 绑定(bind)到 ViewModel 上的 ListCollectionView。我还有几个用于过滤 ListView 的组合框。当用户从组合框中选
我正在使用 ListCollectionView 作为选项卡控件的数据上下文。我已经基于枚举向其中添加了一个 GroupDescription,我希望一个特定的组显示为选项卡控件中的第一个选项卡,但现
我像这样扩展了 ListCollectionView 并覆盖了 GetItemAt: public class LazyLoadListCollectionView : ListCollectionV
当我运行以下测试时,我得到一个 ArgumentOutOfRangeException: [TestClass] public class ReproduceException { [Test
我有一个 ObservableCollection位于 WPF 中的 ViewModel DataGrid . DataGrid有三列: 职位栏;这是在运行时由 UserControl 呈现的,它显示
考虑以下代码(出于示例目的而通用类型名称): // Bound to ListBox.ItemsSource _items = new ObservableCollection(); // ...It
我最近在 CodeReview (CodeReview Question) 上发布了一个问题,并按照他们的建议从 ObservableCollection 转移到 ICollectionView 再到
由于 ListCollectionView 不支持索引器(例如 View[0]),我发现迭代过滤/排序列表的唯一方法是使用 foreach。 1) foreach 是否会确保在迭代期间保留 View
我遇到的问题是我的 listcollectionview 需要 3-4 秒才能更新。我想我已经正确配置了虚拟化;但是,如果不正确,请指出。我将 itemssource 绑定(bind)到 IColle
深入挖掘后,为什么 live shaping,详细按名称自动排序组,不起作用,我决定写一个小的测试应用程序,解决方案下载在这里: here 下面是问题的描述:我使用一个 ObservableColle
C#: public partial class MainWindow : Window { private readonly ViewModel vm; public MainWin
我有一个绑定(bind)到 ListCollectionView 的 ListView。 在同一个窗口中,我有一个 Button,它带有一个附加的 RoutedCommand,没有 CanExecut
所以我有一个非常简单的数据网格,其组样式如下:
这些似乎都不起作用: var source = myViewModel.MyListCollectionView.Select(x => x as MyType); var source = myVi
这里有一个双管齐下的问题,但我认为这两个主题交织在一起足以保证将它们放在一起。 在我们的应用程序中,我们有一个 ListBox ,其中填充了可能是大量项目的内容。这些项目中的每一个都使用相当复杂的项目
我想在具有 DataTable 作为 ItemsSource 的 ListView 上进行自定义排序: myListView.ItemsSource = (data as DataTable); 这是
我是一名优秀的程序员,十分优秀!