红着眼 2023-11-23 14:48 采纳率: 27.8%
浏览 12
已结题

WPF DataGrid怎么只显示指定的数据呢?DataGrid自定义模板。WPF播报通知。

WPF DataGrid怎么只显示数据源中的前面N条数据呢。
场景是这样的。我有2个页面,如下图1,图2。都是绑定的同一数据源(大概1000条数据)。
图1只是提供看的,图2是提供数据的增删改的。图2修改或者是删除数据后图1会立马的更新。
但是图1只需要显示前5条数据就可以了。我本来想在Cache中去新建一个方法去筛选5条数据,但是这样的话图2更新了数据,图1就不能及时更新了。
请问有什么好的解决方案吗?

using System;
using System.Linq;
using SG.com.ll.Config.Notice;
using System.Collections.Generic;
using System.Collections.ObjectModel;

namespace SG.Views.Scheduling
{
    public class Cache
    {
        //订单信息
        private static ObservableCollection<MainOrderNotice> orderEntityList = new ObservableCollection<MainOrderNotice>();
        public static ObservableCollection<MainOrderNotice> OrderEntityList
        {
            get { return orderEntityList; }
            set { orderEntityList = value; }
        }
    }
}

//首页数据绑定
 this.gridOrder.ItemsSource = Cache.OrderEntityList;

img

//订单操作页面数据绑定
this.detailsGridOrder.ItemsSource = Cache.OrderEntityList;

img

  • 写回答

11条回答 默认 最新

  • 社区专家-Monster-XH 2023-11-23 15:04
    关注
    • 你的情况下想在不影响图2的增删改功能的同时,让图1只显示前5条数据。可以在图1的ViewModel中添加一个属性来绑定到DataGrid的ItemsSource,该属性会从Cache.OrderEntityList中获取前5条数据。以示例代码:
    // ViewModel for 图1
    public class DisplayViewModel
    {
        public ObservableCollection<MainOrderNotice> DisplayOrderList => new ObservableCollection<MainOrderNotice>(Cache.OrderEntityList.Take(5));
    }
    
    // Code-behind for 图1
    this.gridOrder.ItemsSource = new DisplayViewModel().DisplayOrderList;
    
    • 这段代码用LINQ的Take方法来创建一个新的ObservableCollection,只包含前5条数据,并将其设置为DataGrid的ItemsSource。由于ObservableCollection是绑定到图2的完整数据源的,任何对图2数据的修改都会反映在图1中,只要你调用OnPropertyChanged通知UI更新。

    • 如果你不想每次数据更改时都创建一个新的ObservableCollection,可以创建一个方法来更新DisplayOrderList的内容,只在需要时(例如数据更改事件触发时)更新前5条记录。这样可以提高性能,特别是在数据量较大时。

    public class DisplayViewModel : INotifyPropertyChanged
    {
        private ObservableCollection<MainOrderNotice> displayOrderList;
    
        public ObservableCollection<MainOrderNotice> DisplayOrderList
        {
            get { return displayOrderList; }
            private set
            {
                displayOrderList = value;
                OnPropertyChanged(nameof(DisplayOrderList));
            }
        }
    
        public DisplayViewModel()
        {
            UpdateDisplayList();
            Cache.OrderEntityList.CollectionChanged += (s, e) => UpdateDisplayList();
        }
    
        private void UpdateDisplayList()
        {
            DisplayOrderList = new ObservableCollection<MainOrderNotice>(Cache.OrderEntityList.Take(5));
        }
    
        public event PropertyChangedEventHandler PropertyChanged;
    
        protected virtual void OnPropertyChanged(string propertyName)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }
    
    • 这个ViewModel类订阅了Cache.OrderEntityList的CollectionChanged事件,这样每当数据变更时,都会调用UpdateDisplayList方法来更新图1的显示数据。不过要注意的是,如果你的数据更新非常频繁,这种方法可能会导致性能问题。在这种情况下,你可能需要更复杂的逻辑来减少UI更新的次数。
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(10条)

报告相同问题?

问题事件

  • 系统已结题 12月5日
  • 已采纳回答 11月27日
  • 创建了问题 11月23日

悬赏问题

  • ¥50 AI大模型精调(百度千帆、飞浆)
  • ¥15 关于#c语言#的问题:我在vscode和codeblocks中编写c语言时出现打不开源文件该怎么办
  • ¥15 非科班怎么跑代码?如何导数据和调参
  • ¥15 福州市的全人群死因监测点死亡原因报表
  • ¥15 Altair EDEM中生成一个颗粒,并且各个方向没有初始速度
  • ¥15 系统2008r2 装机配置推荐一下
  • ¥500 服务器搭建cisco AnyConnect vpn
  • ¥15 悬赏Python-playwright部署在centos7上
  • ¥15 psoc creator软件有没有人能远程安装啊
  • ¥15 快速扫描算法求解Eikonal方程咨询