当以编程方式设置 IsSelected 属性 时,Datagrid 虚拟化无法正常工作
Datagrid Virtualization does not work properly when IsSelected property is set programatically
我正在使用将加载一千多个项目的数据网格,因此我启用了虚拟化。当我尝试 select all using the Datagrid.SelectAll() in code behind 时,selection 工作正常。但是当我以编程方式更改隐藏项目的 IsSelected 属性 时,当我向下滚动时项目不会更新。
使用 SelectAll() 的步骤:
- 最初,所有项目都是 select 在代码隐藏中使用 SelectAll() 编辑的。
- 我 select编辑了 1 行。
- 除 select 一项外,所有其他项目都将取消select。
使用编程方式将 IsSelected 属性 更新为 true 的步骤:
- 最初所有项目都是select通过以编程方式更新每个项目属性编辑的属性 IsSelected=true。
- 我 select编辑了 1 行。
- 除当前selected 行外,其他可见项都已删除selected。但是当我向下滚动时,隐藏的项目仍然是 selected。
如何更新隐藏项的 IsSelected 属性?
试试这个 DataGrid.UnselectAllCells();
我已经通过处理选择时的隐藏项解决了这个问题change.This是使用 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
}
我正在使用将加载一千多个项目的数据网格,因此我启用了虚拟化。当我尝试 select all using the Datagrid.SelectAll() in code behind 时,selection 工作正常。但是当我以编程方式更改隐藏项目的 IsSelected 属性 时,当我向下滚动时项目不会更新。
使用 SelectAll() 的步骤:
- 最初,所有项目都是 select 在代码隐藏中使用 SelectAll() 编辑的。
- 我 select编辑了 1 行。
- 除 select 一项外,所有其他项目都将取消select。
使用编程方式将 IsSelected 属性 更新为 true 的步骤:
- 最初所有项目都是select通过以编程方式更新每个项目属性编辑的属性 IsSelected=true。
- 我 select编辑了 1 行。
- 除当前selected 行外,其他可见项都已删除selected。但是当我向下滚动时,隐藏的项目仍然是 selected。
如何更新隐藏项的 IsSelected 属性?
试试这个 DataGrid.UnselectAllCells();
我已经通过处理选择时的隐藏项解决了这个问题change.This是使用 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
}