ObservableCollection是一个.NET集合类,它在集合中添加,删除,替换,移动或重新排序项目时,或者在替换集合的整个内容时发送事件通知。
MAUI:从 ObservableCollection 中删除最后一项时出现问题
我正在使用“ObservableCollection”保存评论。当我删除评论时,我将获取已删除的评论 ID 并从“ObservableCollection”中删除该评论。 我的问题是如果我删除...
我在视图模型中有一个方法,每次从 Binance Api 发送数据时都会更新可观察集合(指标)。但是,如果我从该列表中删除最后一项(按下按钮...
c# wpf MVVM 从 ObservableDictionary 获取 ObservableList
我的应用程序速度存在一些问题,并进行了一些性能分析。结果表明,我的应用程序中有很多时间花在 linq 查询上,尤其是......
我的目的是更新 UI 上的 ping 状态。我在 MAUI 桌面应用程序中使用 MVVM 模式。 在 MainPage.xaml.cs 中 命名空间 MauiSamApp { 公共部分类 MainPage :ContentPage { ...
是否可以将 Collectionview 中的数组与 ObservableCollection 绑定?
我是新来的,也是新的 .Net Maui 开发人员。我使用 API 并通过 GET 请求接收要处理的数据。我收到的数据由包含不同数量项目的收据组成
我有一个绑定可观察集合的数据网格。当我单击添加新按钮时,我会将新行添加到集合中。我如何实用地滚动到新行。 数据网格 XMAL 我有一个绑定可观察集合的数据网格。当我单击添加新按钮时,我会将新行添加到集合中。我如何实用地滚动到新行。 数据网格XMAL <DataGrid SelectedIndex="{Binding SelectedIntex}" IsEnabled="{Binding IsKeySet}" CanUserDeleteRows="False" CanUserAddRows="False" Name="dgwTemplateDetails" SelectionMode="Single" ItemsSource="{Binding OrderTemplateList, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" SelectedItem="{Binding SelectedOrderTemplate}" IsReadOnly="False" AutoGenerateColumns="False" Width="auto"> <DataGrid.Columns> <DataGridTextColumn Header="Srl No" Visibility="Hidden" Binding="{Binding SrlNo}"/> <DataGridTextColumn Header="Act Code" Width="75" Binding="{Binding ActCode, UpdateSourceTrigger=PropertyChanged}"/> <DataGridTextColumn Header="Act Name" Width="275" Binding="{Binding ActName, UpdateSourceTrigger=PropertyChanged}"/> <DataGridTextColumn Header="No. Of Days" Width="75" Binding="{Binding NoOfDays, UpdateSourceTrigger=PropertyChanged}"/> <DataGridCheckBoxColumn Header="Is Cutting" Width="75" Binding="{Binding IsCutSelected, UpdateSourceTrigger=PropertyChanged}" /> </DataGrid.Columns> </DataGrid> VM 添加行功能 if (ValidateHeader()) { if (OrderTemplateList == null) this.OrderTemplateList = new ObservableCollection<EventManagementTemplate>(); EventManagementTemplate obJEvent = new EventManagementTemplate(); obJEvent.BuyerCode = this.BuyerCode; this.OrderTemplateList.Add(obJEvent); int no = 1; this.OrderTemplateList.ToList().ForEach(m => m.SrlNo = no++); } 您需要执行以下操作: 为您的 dataGrid 命名,以便您可以在代码隐藏文件(与包含数据网格的 xaml 文件配对的 .cs 文件)中访问它 向您的视图模型添加一个委托,以供 AddRow 函数调用 - 该委托应将您想要滚动到视图中的对象作为参数。 让包含数据网格的背后代码订阅委托==>基本上,背后的代码是提供对视图模型的回调。回调后面的代码将是滚动到新项目的代码。 回调应调用数据网格的 ScrollIntoView 函数 (http://msdn.microsoft.com/en-us/library/system.windows.controls.datagrid.scrollintoview(v=vs.110).aspx) 在视图模型的添加行函数结束时(添加项目后),使用要滚动到视图中的项目调用委托。 示例代码: public class MyViewModel { // declare the delegate signature... delegate void ScrollIntoViewDelegateSignature(EventManagementTemplate objEvent); // create a pointer to the delegate that can be set by the code behind... public ScrollIntoViewDelegateSignature ScrollIntoView {get; set;} protected AddRow() { .. your code here // call the delegate... if (ScrollIntoView != null) ScrollIntoView(objEvent) } } public class MyControlOrWindowThatContainsDataGrid : UserControl/ChildWindow/Page { public void Initialize() { ...your code here // set the scrollIntoView delegate... myViewModel.ScrollIntoView = ScrollIntoView; } // create a ScrollIntoView function // ==> the return value and parameters MUST match the delegate signature public void ScrollIntoView(EventManagementTemplate objEvent) { myDataGrid.ScrollIntoView(objEvent); } } 参考 http://msdn.microsoft.com/en-us/library/900fyy8e.aspx 我认为最好使用事件来做到这一点,但这更复杂。 以下是有关如何使用事件的 msdn 文档:http://msdn.microsoft.com/en-us/library/awbftdfh.aspx 您可以为 DataGrid 创建行为。在此代码中,仅当新行添加到集合中时,它才会滚动到网格的最后一行。您可以根据任何条件修改它。有时需要添加一些延迟。如果不需要,您可以排除。 public class AutoScrollToEndBehavior : Behavior<DataGrid> { private DateTime _lastCollectionChangedTime = DateTime.MinValue; protected override void OnAttached() { base.OnAttached(); SubscribeToCollectionChanged(); } protected override void OnDetaching() { base.OnDetaching(); UnsubscribeFromCollectionChanged(); } private void SubscribeToCollectionChanged() { if (AssociatedObject.Items is ICollectionView collectionView) { collectionView.CollectionChanged += OnCollectionChanged; } } private void UnsubscribeFromCollectionChanged() { if (AssociatedObject.Items is ICollectionView collectionView) { collectionView.CollectionChanged -= OnCollectionChanged; } } private void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) { if (e.Action == NotifyCollectionChangedAction.Add) { _lastCollectionChangedTime = DateTime.Now; Task.Delay(100).ContinueWith(_ => { if ((DateTime.Now - _lastCollectionChangedTime).TotalMilliseconds > 100) { ScrollToEnd(); } }, TaskScheduler.FromCurrentSynchronizationContext()); } } private void ScrollToEnd() { if (AssociatedObject.Items.Count > 0) { var lastItem = AssociatedObject.Items[AssociatedObject.Items.Count - 1]; AssociatedObject.Dispatcher.Invoke(() => { AssociatedObject.ScrollIntoView(lastItem); }); } } } 在 XAML 中, 在 datagrid () 的结束标记上方添加以下代码 <b:Interaction.Behaviors> <behavior:AutoScrollToEndBehavior/> </b:Interaction.Behaviors> </DataGrid> 在 DataGrid 中添加项目后尝试此操作: dgwTemplateDetails.ScrollIntoView(obJEvent); 此行将滚动到当前添加的元素。
是否可以从 ObservableCollection 中隐藏 elementis ?毛伊岛网络
我正在使用 MVVM 和 Ms Toolkit。 我正在 CollectionView 中显示一个集合..但我(如果可能)想隐藏“已删除项目”(由模型上的已删除标志设置)。 这就是为什么我使用 g...
Xamarin Forms ListView 未从 ObservableCollection 更新
我的 XAML 文件的 ListView 正在填充一个 ViewModel,该 ViewModel 具有来自服务的 ObservableCollection,但 ListView 未显示信息。我已经检查过服务是否正常
MVVM - 在 .Clear 和 new 加载 ObservableCollection 之后保留选择
我有一个应用程序,它使用 SQL Select 提取 DataTable,然后将每个项目加载到每个类的 ObservableCollection 中。 视图模型: 公共可观察集合 我有一个应用程序,它使用 SQL Select 提取 DataTable,然后将每个项目加载到每个类的 ObservableCollection 中。 视图模型: public ObservableCollection<SchachtelEintrag> DataGridMainCollection { get; set; } = new ObservableCollection<SchachtelEintrag>(); private void loadDataGridMainCollection() { DataGridMainCollection.Clear(); DataTable dt = new DataTable(); dt = mySql.selectSql("SELECT id, datum, artikel, kurztext, stueckzahl, blechstaerke, rohrmasse, " + "material, kundenauftrag, ansprechpartner, abteilung, geaendertAm, twoWeeks, prio, ordnerpfad, dateiname FROM auftragstool.orders WHERE zustand = 'zu schachteln' ORDER BY import ASC, blechstaerke DESC"); if (dt.Rows.Count > 0) { foreach (DataRow r in dt.Rows) { DataGridMainCollection.Add(new SchachtelEintrag { Id = Convert.ToInt32(r["id"].ToString()), Datum = Convert.ToDateTime(r["datum"].ToString()), Artikel = r["artikel"].ToString(), Kurztext = r["kurztext"].ToString(), Stueckzahl = Convert.ToInt32(r["stueckzahl"].ToString()), Blechstaerke = r["blechstaerke"].ToString(), Rohrmasse = r["rohrmasse"].ToString(), Material = r["material"].ToString(), Kundenauftrag = r["kundenauftrag"].ToString(), Ansprechpartner = r["ansprechpartner"].ToString(), Abteilung = r["abteilung"].ToString(), GeaendertAm = r["geaendertAm"].ToString(), TwoWeeks = r["twoWeeks"].ToString(), Prio = r["prio"].ToString(), Ordnerpfad = r["ordnerpfad"].ToString(), Dateiname = r["dateiname"].ToString() }); } } } 我的 DataGrid 绑定到 ObservableCollection。 XAML: <DataGrid ItemsSource="{Binding DataGridMainCollection}" Selected="{Binding SelectedRow, Mode=TwoWay}"> 现在不同的人正在使用该程序。一旦位置被删除或添加,程序就会向 TCP 服务器发送一个字符串。 TCP 服务器将命令发送回客户端,从而重新触发以下代码: 视图模型: loadDataGridMainCollection() //Void from above 现在我知道重建 ObservableCollection 后,网格中的 SelectedItem 不再可用于选择项目。 其他人如何处理这个问题以更新整个集合而不失去焦点? 在清除集合之前,请备份当前选定的项目(或仅备份选定项目的 ID)。清除并刷新后,您必须在新填充的列表中找到您的备份项目。 这可以通过以下方式完成: int? currentlySelectedId = null; if(SelectedRow != null) currentlySelectedId = SelectedRow.Id; DataGridMainCollection.Clear(); // your code to refresh the data here if(currentlySelectedId != null) SelectedRow = DataGridMainCollection.FirstOrDefault(i => i.Id == backupItem.Id);
反序列化 JSON 时,如何将声明为 IList<T> 的属性的具体类型配置为 ObservableCollection<T>?
我有一些类对我期望的 JSON 文件结构进行建模。对于 JSON 中的数组值,相应的属性被声明为 IList 类型,用于 vari...
配置IList类型的字段在反序列化JSON时获取哪个Type
我有一些类对我期望的 JSON 文件结构进行建模。对于 JSON 中的列表字段,类中相应的属性具有 IList 类型。我不...
分组 Observable CollectionView 延迟加载不会在 iOS 上触发
我的 .NET MAUI 应用程序中有一个包含按类型分组的任务项的 CollectionView,当满足 ItemThreshold 时会触发按需加载。这种行为在 Android 上运行良好,但似乎并不适用
如标题所示,我正在尝试实现 ObservableCollection 项目的自动包装,目前我正在使用 CollectionChanged 事件来执行此操作,其中我检查元素是否为所需类型,如果不是,我...
ObservableCollection 绑定到另一个 ObservableCollection 不会触发 CollectionChanged
我有 ControlA 托管 ControlB,它们都有 ObservableCollection 类型的 DependencyProperty,嵌套控件的 (ControlB) 属性绑定到父级 (ControlA) 属性,如果有的话
为什么我的 ObservableCollection 在使用新列表重新初始化时没有更新?
我创建了一个 MAUI 应用程序,在视图模型中我有一个 ObservableCollection 存储位置。然后这些将显示在 UI 上的图表上。 但是位置的计算需要花费...
高效地将一系列值添加到 ObservableCollection
我有一个 ObservableCollection 项目,它绑定到我视图中的列表控件。 我遇到一种情况,我需要将一大块值添加到集合的开头。 收藏.在...
ObservableCollection 在 WPF 中不会自动通知 UI
我正在尝试构建我的第一个基于 MVVM 模式的应用程序。 我仍然没有将视图与按钮单击操作隔离,因为我陷入了 ObservableCollection 的这个问题。 这些是课程:
无法将 ObservableCollection<Video> 从一个页面传递到另一页面
我无法将 ObservableCollection 从一个页面传递到另一个页面。我在整个项目中都使用相同的模式,所以我不确定为什么它在这里失败。我正在使用 MVVM 模式。 这是我的
抛出异常:mscorlib.ni.dll 中的“System.ArgumentNullException”
我是 c# 新手,正在尝试为我的 ObservableCollection 类实现 INotifyPropertyChanged 但它给出了一个错误并且数据没有被绑定。有人请帮我解决这个问题 一个
有没有办法直接绑定到模型中的集合并手动告诉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 的属性并通知该属性。