observablecollection 相关问题

ObservableCollection是一个.NET集合类,它在集合中添加,删除,替换,移动或重新排序项目时,或者在替换集合的整个内容时发送事件通知。

ObservableCollection 在 WPF 中不会自动通知 UI

我正在尝试构建我的第一个基于 MVVM 模式的应用程序。 我仍然没有将视图与按钮单击操作隔离,因为我陷入了 ObservableCollection 的这个问题。 这些是课程:

回答 1 投票 0

无法将 ObservableCollection<Video> 从一个页面传递到另一页面

我无法将 ObservableCollection 从一个页面传递到另一个页面。我在整个项目中都使用相同的模式,所以我不确定为什么它在这里失败。我正在使用 MVVM 模式。 这是我的

回答 1 投票 0

抛出异常:mscorlib.ni.dll 中的“System.ArgumentNullException”

我是 c# 新手,正在尝试为我的 ObservableCollection 类实现 INotifyPropertyChanged 但它给出了一个错误并且数据没有被绑定。有人请帮我解决这个问题 一个

回答 3 投票 0

如何绑定到非 ObservableCollection?

有没有办法直接绑定到模型中的集合并手动告诉WPF绑定需要刷新,而不必在视图模型中为其创建ObservableCollection? 有没有办法直接绑定到模型中的 Collection 并手动告诉 WPF 绑定需要刷新,而不必在视图模型中为其创建 ObservableCollection? <ListBox ItemsSource="{Binding Position.PossibleMoves}"> ... </ListBox> Position 是我的模型,是国际象棋库的一部分,PossitionMoves 是其中的一个集合。我不想实现 INotifyProperty 更改或将 ObservableCollections 放入独立的优化库中。 我想避免每次更新位置时将PossibleMoves复制到ObservableCollection中。数据绑定在初始化时起作用,但如果我也可以在视图模型内随意刷新绑定,那就会很方便。 从视图模型调用 OnNotifyPropertyChanged("Position.PossibleMoves") 不起作用,因为对集合本身的引用不会更改。 您可以通过使用附加行为将处理程序绑定到在视图模型中触发的事件来实现此目的。不过,您不能直接绑定到事件,因此您必须将它们包装在一个类中,如下所示: public class Refresher { public delegate void RefreshDelegate(); public event RefreshDelegate Refresh; public void DoRefresh() { if (this.Refresh != null) this.Refresh(); } } 现在将其实例添加到您的视图模型中: public class MyViewModel { public IList<string> Items { get; set; } private Refresher _Refresher = new Refresher(); public Refresher Refresher {get {return this._Refresher;}} } 接下来创建一个附加行为,该行为向该事件注册委托实例并强制列表框刷新其绑定: public static class RefreshBehavior { public static readonly DependencyProperty RefresherProperty = DependencyProperty.RegisterAttached( "Refresher", typeof(Refresher), typeof(RefreshBehavior), new PropertyMetadata(null, OnRefresherChange)); public static void SetRefresher(DependencyObject source, Refresher value) { source.SetValue(RefresherProperty, value); } public static Refresher GetRefresher(DependencyObject source) { return (Refresher)source.GetValue(RefresherProperty); } private static void OnRefresherChange(DependencyObject d, DependencyPropertyChangedEventArgs e) { Refresher.RefreshDelegate handler = () => { var listBox = d as ListBox; listBox.Items.Refresh(); }; if (e.NewValue != null) (e.NewValue as Refresher).Refresh += handler; if (e.OldValue != null) (e.OldValue as Refresher).Refresh -= handler; } } 最后将其附加到 xaml 中的列表框: <ListBox ItemsSource="{Binding Items}" local:RefreshBehavior.Refresher="{Binding Refresher}"/> 就是这样。在视图模型中调用 Refresher.DoRefresh(),它将强制列表框更新。 这可行,但实际上是将方钉锤入圆孔。如果我是你,我会尽我所能尝试在你的视图模型中进行正确的集合更改通知。我理解您希望将 ObservableCollection 排除在模型之外,但有一些方法可以自动代理更改通知(例如 Castle DynamicProxy)。 您需要从 Position 类内部为 possibleMoves 通知属性更改,或者创建一个委托给 Position.PossibleMoves 的属性并通知该属性。

回答 2 投票 0

将项目添加到 ObservableCollection 时更新 WPF Datagrid

我无法弄清楚这个来拯救我的生命。 我有一个简单的 WPF 表单,在文本框中输入数据,用户可以单击插入并将其保存到数据库。我还有一个数据网格正在显示...

回答 1 投票 0

ObservableCollection 在清除后显示项目的顺序不正确

我有一个 ObservableCollection,我在其中添加项目并偶尔清除。 然后是反应式管道,其想法是按插入顺序获取 ObservableCollection 的当前内容。 是...

回答 1 投票 0

为什么不能从不同的线程更新 ObservableCollection?

在多线程 WPF 应用程序中,无法从 WPF 窗口线程以外的线程更新 ObservableCollection。 我知道有解决方法,所以我的问题不是如何避免......

回答 2 投票 0

请批评这个方法

嗨,我一直在网上寻找一些选项卡按钮关闭功能,但所有这些解决方案都有一些复杂的事件处理程序,我想尝试保持简单,但我可能已经破坏了

回答 2 投票 0

如何在.Net MAUI 中保持 CollectionView 始终滚动到底部

我想使用CollectionView创建一个日志窗口。每当添加新项目时,它应该自动滚动到底部。我尝试使用一种行为来实现此功能,以便轻松......

回答 2 投票 0

PowerShell 可观察集合事件

我正在尝试在 PowerShell 中为可观察集合注册 PropertyChanged 事件,但没有成功。这对于 CollectionChanged 事件来说效果很好。 这有效: 注册对象事件 -

回答 1 投票 0

.NET MAUI ListView - ObservableCollection - 在异步方法期间不更新

我尝试了几种不同的方法来做到这一点,但还没有完全弄清楚如何组合才能使其按预期工作。这是在使用 .NET 6 的 .NET MAUI 中。基本上,UI 没有更新/

回答 1 投票 0

在 ObservableCollection 中添加项目时,NewItems 始终为 null

我正在开发一个 WPF 应用程序,我在其中使用 ObservableCollection。我使用 Add() 方法将对象添加到该集合中。我的问题是,当我管理 CollectionChanged 事件时,我...

回答 0 投票 0

分组集合视图在 iOS 上显示空组

我有一个 MAUI 应用程序,其视图绑定到包含具有以下属性集的分组 CollectionView 的视图模型: 我有一个 MAUI 应用程序,其视图绑定到包含分组 CollectionView 的视图模型,这些属性集: <CollectionView x:Name="MyList" VerticalOptions="FillAndExpand" ItemsSource="{Binding CollectionViewItemSourceGrouped}" SelectionMode="Single" SelectedItem="{Binding MyItem, Mode=TwoWay}" SelectionChangedCommand="{Binding MySelectionCommand}" RemainingItemsThreshold="2" RemainingItemsThresholdReachedCommand="{Binding LoadMoreItemsCommand}" IsGrouped="True" EmptyView="No item found."> 我从可等待的 Web api 获取源项目并将其分组,当我第一次导航到视图时,如果我开始来回切换过滤列表的开关,我会正确地对集合进行分组。不幸的是,当我导航到详细信息页面并通过 Shell 导航返回到集合时,如果我再次按下开关并重新加载列表,我总是会得到一些空组,并且它在图形上会导致一团糟。 用作集合源的对象是CollectionViewItemSourceGrouped,它是一个具有以下实现的ObservableCollection<ItemsGroup>: public class ItemsGroup : ObservableRangeCollection<ItemModel> { public DateTime Date { get; private set; } public ItemsGroup(DateTime date, ObservableRangeCollection<ItemModel> list) : base(list) { Date = date; } } 每次我重新加载数据时,我确保对象CollectionViewItemSourceGrouped被设置为null或者是一个新的空对象。我希望该集合是空的,而这会继续显示只有标题集的空组。我怎样才能摆脱它们并让收藏正确刷新? 这只发生在 iOS 和 MacCatalyst 上。它在 Android 和 WinUI 上运行良好。

回答 0 投票 0

PropertyChanged 与 CollectionChanged - 请帮助理解基础知识

经过大量研究,我确实需要你的帮助。关于我的第一个版本的评论一直在帮助我寻找新的关键词。 在研究时,我发现了几篇这样的文章:

回答 0 投票 0

PropertyChanged 仅提高一次,尽管属性经常变化(ArrayList、ObservableCollection<int>)

经过大量研究,我确实需要你的帮助。在研究时,我发现了几篇这样的文章: 如何将模型更改从模型传达给 ViewModel 双向绑定到数组中的

回答 0 投票 0

如何编辑嵌套集合中的项目

我有组(ObservableCollection 类型) 每组包括一个项目(集合类型)。 我有一个组集合(ObservableCollection 类型)每个组都有一个项目集合(

回答 0 投票 0

如何在不调用所有对象的 c'tor 的情况下对列表框 ItemSource 进行排序? WPF

我有以下列表框 我有以下列表框 <ListBox SelectionMode="Extended" ItemsSource="{Binding Containers}" AllowDrop="True" Margin="0,0,5,0"> <ListBox.ItemContainerStyle> <Style TargetType="ListBoxItem"> <Setter Property="IsSelected" Value="{Binding Content.IsSelected, Mode=TwoWay, RelativeSource={RelativeSource Self}}"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="ListBoxItem"> <ContentPresenter/> </ControlTemplate> </Setter.Value> </Setter> </Style> </ListBox.ItemContainerStyle> <ListBox.ItemTemplate> <DataTemplate DataType="{x:Type vm:ContainerViewModel}"> <local:ContainerUserControl DataContext="{Binding}" /> </DataTemplate> </ListBox.ItemTemplate> <ListBox.ItemsPanel> <ItemsPanelTemplate> <VirtualizingStackPanel IsVirtualizing="True" VirtualizationMode="Recycling" /> </ItemsPanelTemplate> </ListBox.ItemsPanel> ContainerUserControl 是具有扩展器(带有标题和内容)的用户控件。 视图模型是 ContainerViewModel 绑定的物品来源为: private ObservableCollection<ContainerViewModel> _containers; public ObservableCollection<ContainerViewModel> Containers { get => _containers; set { _containers = value; OnPropertyChanged(); } } 问题是当我为容器分配新集合时,每个元素的构造函数都被调用: public partial class ContainerUserControl : UserControl { public ContainerUserControl() { InitializeComponent(); Debug.Print("in ContainerUserControl"); } } 如果我有几千件物品,可能需要很长时间。 现在假设我有 10k 个项目,我想使用以下代码对这个集合进行排序: Containers = new ObservableCollection<ContainerViewModel>(Containers.OrderByDescending(i => i.Name)); 我会看到用户控件构造函数被调用了 10k 次。 在阅读了一些帖子后,我决定使用“移动”方法实现就地排序,但不幸的是,即使我这样做了: _containers.Move(0, 1); 我看到我通过了 userControl c'tor。如果我有数千个移动操作,就像使用 orderby 方法并分配排序列表一样。 此外,我尝试创建一个新的排序集合并在 itemsSource 之间切换,但它没有帮助,仍然输入 c'tor 10k 次。 public ObservableCollection<ContainerViewModel> SortedContainers { get; set; } // already sorted public ListBox ContainerListBox { get; set; } // the listbox from xaml ContainerListBox.ItemsSource = null; ContainerListBox.ItemsSource = SortedContainers; 无论我尝试什么,我都无法避免 c'tor 被调用数千次并造成可怕的性能问题。 我怎样才能避免 c'tor 打电话?为什么这个 c'tor 无论如何都被称为? 任何帮助将不胜感激:) ListBox使用UI虚拟化。它不会加载所有项目。只有那些在虚拟化视口内的。因为默认情况下启用虚拟化,所以覆盖 ListBox.ItemPanel 是多余的。 同样适用于 DataTemplate 内的 DataCContext 绑定:DataContext(或一般父元素)的 DataTemplate 是隐式继承的。无需明确设置。 在您的情况下,所有项目都已加载,因为您的ListBox没有高度限制。它会自动拉伸以使所有项目适合。要启用 UI 虚拟化,请为 ListBox 分配一个 Height,以便 ScrollViewer 可以工作。 ScrollViewer 对于 UI 虚拟化是必不可少的。 高度可以显式设置,例如通过设置 ListBox.Height 属性或隐式设置,例如通过将 ListBox 添加到 Grid,其中行高设置为除 Auto 以外的任何值。 此外,您不应替换源集合。过滤、排序和分组是通过修改“CollectionViewthat is bound to theItemsControl. In WPF the binding engine will automatically use the default ColectionViewto display the items. This allows you to modify the displayed items without modifying the original underlying collection. For example, sorting aCollectionView”完成的,不会对底层集合进行排序。 你用静态的CollectionViewSource.GetDefaultView方法获取默认的CollectionView: <ListBox ItemsSource="{Binding Containers}" VirtualizingPanel.VirtualizationMode="Recycling" Height="300"> <ListBox.ItemTemplate> <DataTemplate DataType="ContainerViewModel"> <ContainerUserControl /> </DataTemplate> </ListBox.ItemTemplate> </ListBox> private ObservableCollection<ContainerViewModel> _containers; public ObservableCollection<ContainerViewModel> Containers { get => _containers; set { _containers = value; OnPropertyChanged(); } } private void SortContainersByName() { var sortDescription = new SortDescription(nameof(ContainerViewModel.Name), ListSortDirection.Ascending); ICollectionView containersView = CollectionViewSource.GetDefaultView(this.Containers); // Apply sorting criteria containersView.SortDescriptions.Add(sortDescription); } private void ClearSortContainersByName() { SortDescription sortDescriptionToRemove = this.DataGridItemsView.SortDescriptions .FirstOrDefault(sortDescription => sortDescription.PropertyName.Equals(nameof(ContainerViewModel.Name), StringComparison.Ordinal)); ICollectionView containersView = CollectionViewSource.GetDefaultView(this.Containers); // Clear sorting criteria containersView.SortDescriptions.Remove(sortDescriptionToRemove); }

回答 1 投票 0

使用 MVVM Communitytoolkit 使用 RelayCommand 更改初始化按钮列表的属性

我有带 .NETCore 7 的 WPF 应用程序,加载时我有视图和视图模型 我使用视图模型中的代码生成按钮列表,如下所示 公共部分类 DataViewModel :ObservableO ...

回答 2 投票 0

如何在 .net Maui 中显示 ObservableCollection 内容?

我正在做我的项目,我遇到了一个问题。我不知道如何显示列表中的数据。 代码隐藏: public ObservableCollection GameResultsToShow { get;放; } ...

回答 1 投票 0

为什么 Observable 集合不绑定到集合?

如果我正确理解 ObservableCollection,它会绑定到一个类的对象,并知道何时添加和删除这些对象,并相应地更新 UI,但不一定在 e...

回答 0 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.