以编程方式设置IsSelected属性时,Datagrid虚拟化无法正常工作

时间:2016-02-25 09:06:53

标签: c# wpf datagrid virtualization

我正在使用将加载超过一千件商品的datagrid,因此我启用了虚拟化。当我尝试在后面的代码中使用Datagrid.SelectAll()选择所有时,选择工作正常。但是当我以编程方式更改隐藏项目的IsSelected属性时,向下滚动时项目不会更新。

使用SelectAll()的步骤:

  1. 最初使用后面的代码中的SelectAll()选择所有项目。
  2. 我选择了一行。
  3. 除了所选项目之外,所有其他项目都将被取消选中。
  4. 使用以编程方式将IsSelected属性更新为true的步骤:

    1. 最初,通过以编程方式更新每个项目属性IsSelected = true来选择所有项目。
    2. 我选择了一行。
    3. 取消选择可见项目,但当前选定的行除外。但是当我向下滚动时,仍然会选择隐藏的项目。
    4. 如何更新隐藏项目的IsSelected属性?

2 个答案:

答案 0 :(得分:0)

试试这个DataGrid.UnselectAllCells();

答案 1 :(得分:0)

我通过处理选择更改中的隐藏项来解决了这个问题。这是使用MVVM模式实现的。

        private void HandleContentSelection(SelectionChangedEventArgs e)
        {
            if (e == null) return;

            var dataGrid = e.Source as DataGrid;
            if (dataGrid == null) return;

            #region Update Grid Selection

            if (e.AddedItems != null)
            {
                foreach (var item in e.AddedItems.Cast<IContent>())
                {
                    if (!item.IsSelected)
                    {
                        item.IsSelected = true;
                    }
                }
            }

            if (e.RemovedItems != null)
            {
                _contentsToBeUnselected.Clear();

                // Handle Multiple selection
                // Set hidden items IsSelected property to false
                if (dataGrid.SelectedItems.Count > 0 && (e.AddedItems == null || e.AddedItems.Count == 0) && e.RemovedItems.Count > 1)
                {
                    foreach (var content in dataGrid.Items.Cast<IContent>())
                    {
                        if (!dataGrid.SelectedItems.Contains(content))
                        {
                            _contentsToBeUnselected.Add(content);
                        }
                    }
                }
                // Handle Unselect All
                // Set hidden items IsSelected property to false
                else if (dataGrid.SelectedItems.Count == 0 && (e.AddedItems == null || e.AddedItems.Count == 0))
                {
                    _contentsToBeUnselected.AddRange(dataGrid.Items.Cast<IContent>());
                }
                else
                {
                    _contentsToBeUnselected.AddRange(e.RemovedItems.Cast<IContent>());
                }

                foreach (var item in _contentsToBeUnselected)
                {
                    if (item.IsSelected)
                    {
                        // if bound data item still is selected, fix this
                        item.IsSelected = false;
                    }
                }
            }

            e.Handled = true;

            #endregion

        }