DataGrid 刷新选中问题

摘要:
默认选中第一项可以在数据加载完成后使用一个双向绑定完成,而保持上次的多选项,DataGrid提供了一个内部属性用来控制,即为IsSynchronizedWithCurrentItem,其值为false时,会保持上次的多选项,但此时设置当前选中的。

背景:在项目中遇到了这样的问题,使用的DataGrid需要默认选中第一条数据,即数据加载后,无需用户点击,即可默认选中一项,并且,DataGrid支持筛选操作,需要完成这样的功能,数据源中的数据项的某些属性更新时,需要刷新UI,并且需要保持当前的多选项。

问题:上面的背景中提到了两个问题,一是需要默认选中第一项;二是DataGrid相关的视图进行刷新时需要保持上次的多选项。默认选中第一项可以在数据加载完成后使用一个双向绑定完成,而保持上次的多选项,DataGrid提供了一个内部属性用来控制,即为IsSynchronizedWithCurrentItem,其值为false时,会保持上次的多选项,但此时设置当前选中的。这样只可以实现,便却要判断每一个当前选中项可以会空的场景,并及时的设置当前选中项为视图中的第一项,太过复杂,容易出错。

解决方案:自定一个集合及所使用的视图类,在视图类中判断当前选中项为空且视图列表不为空的情况下,设置当前选中项为列表中第一项,否则为需要保持多选项的情况,即需要控件的IsSynchronizedWithCurrentItem=false来保证,在视图中设置默认选中项时又需要设置IsSynchronizedWithCurrentItem=true才能保持视图中的更改可以及时的刷新到UI上去。因此需要做好的两种情况的判断,从而正确切换IsSynchronizedWithCurrentItem,保证UI的正确性。

实现:数据的筛选需要重新Filter一次,需要调用视图的Refresh操作,通过分析源码,分析出刷新的过程,实现的示例图可参照下图:

注意:IsSynchronizedWithCurrentItem主要是用来同步当前选中项,在多UI使用同一数据源时可以同步当前选中项,但这里的实现并不支持,因为需要视图类与UI耦合。

DataGrid 刷新选中问题第1张

实现源码:

public class CustomCollection<T> : ObservableCollection<T>, ICollectionViewFactory
    {
        publicCustomCollection(Selector selector)
        {
            _selector =selector;
        }

        private readonlySelector _selector;

        publicICollectionView CreateView()
        {
            return new MyView(this, _selector);
        }
    }

    public classMyView : ListCollectionView
    {
        publicMyView(IList list, Selector selector)
            : base(list)
        {
            if (null !=selector)
            {
                _selector =selector;
                _dgSynchronized =_selector.IsSynchronizedWithCurrentItem;
            }
        }

        private readonlySelector _selector;
        private readonly bool?_dgSynchronized;

        private object _preCurrentItem = null;
        protected override voidRefreshOverride()
        {
            _preCurrentItem =CurrentItem;
            base.RefreshOverride();
        }

        protected override voidOnCollectionChanged(NotifyCollectionChangedEventArgs args)
        {
            if (null !=_selector)
            {
                //some scen, CurrentItem can be set by Func before this method, avoid this
                if (_preCurrentItem !=CurrentItem)
                    SetCurrent(null, -1);

                if (null == CurrentItem && InternalCount > 0)
                {
                    _selector.IsSynchronizedWithCurrentItem = true;
                    SetCurrent(InternalList[0], 0);
                }
                else_selector.IsSynchronizedWithCurrentItem = false;
            }

            base.OnCollectionChanged(args);
        }

        protected override voidOnCurrentChanged()
        {
            base.OnCurrentChanged();

            if (null !=_selector)
            {
                _selector.IsSynchronizedWithCurrentItem =_dgSynchronized;
            }
        }
    }

免责声明:文章转载自《DataGrid 刷新选中问题》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇FileStream的读取和写入[转]C++11中的Lamda下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Easy UI 知识点以及easyui datagrid 动态生成列

知识点记录 1.下拉框的属性设置 <input type="text" name="DEP_CODE" data-options="panelWidth:260,                     idField:'GENERAL_CODE',                     textField:'GENERAL_CODE',     ...

wpf 获取datagrid中模板中控件

//获取name为datagrid中第三列第一行模板的控件 FrameworkElement item = dataGrid.Columns[3].GetCellContent(dataGrid.Items[0]); DataGridTemplateColumn temp = dataGrid.Column...

easyui datagrid自定义按钮列,即最后面的操作列(转)

做项目的时候因为需求,要在表格的最后添加一列操作列,easyUI貌似没有提供这种功能,不过没关系,我们可以自定义来实现 版本:jQuery easyUI 1.3.2 这里我的实现方式是采用HTML形式,js方式暂时还没用到 首先是HTML部分 [html]view plaincopyprint? <table id="dg" title="...

WPF平台Grid控件性能比较

WPF官方发布第一个版本至今已经有10年了, 我们几乎在同时也开始了XAML开发。即使经过多年打造,我们依旧尝试提高:我们真的成功打造了高效灵活的控件吗?我没有在其他地方找到任何关于优秀的WPF表格性能比较的介绍,只有少量而年代久远的现在已经不存在的控件的讨论。这个新基准是一种尝试,用来在一些市场相对流行的控件比较中发现我们的优势和不足。 环境 这个基准创...

WPF DataGrid绑定到数据源的方法

1 string conStr = System.Configuration.ConfigurationManager.ConnectionStrings["str"].ConnectionString; 2 SqlConnection con = new SqlConnection(conStr); 3...

扩展easyui.datagrid,添加数据loading遮罩

easyui可以说是轻量级的前端UI框架,更新到1.2.1支持更多的事件,方法和属性 在使用的过程中,发现easyui目前还缺少一些小功能或是未开放出来 拿datagrid插件来说,数据加载提供了两种方式远程和本地数据加载,但只有远程数据加载时才会显示数据加载的遮罩层,在数据加载完成后隐藏遮罩层;而本地数据加载时则不会出现遮罩,这应该是考虑到本地数据加载的...