我将DataGrid与ItemsSource绑定到ViewModel中的ObservableCollection。 DataGrid允许选择多行。 ViewModel订阅一个事件(来自某个服务)并处理该事件包括从ObservableCollection中删除一个对象。如果该对象是选定对象之一,则DataGrid中突出显示的行会发生奇怪的事情。我不知道如何解释它,所以这是一个图像
以下是重现问题的代码。工具栏上添加了删除第3个选定项目的按钮,因此请确保在按下按钮之前选择5个项目。
视图模型
public class MyViewModel
{
public ObservableCollection<MyObject> MyItems { get; set; }
public MyViewModel()
{
MyItems = new ObservableCollection<MyObject>();
for (int i = 0; i < 1000; i++)
{
MyItems.Add(new MyObject("name" + i, i));
}
}
}
查看(xaml)
<Window x:Class="ItemsChangedTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:ItemsChangedTest"
Title="MainWindow" Height="350" Width="525">
<DockPanel>
<ToolBar DockPanel.Dock="Top">
<Button Content="Test" Click="TestButton_Click"/>
</ToolBar>
<DataGrid Name="MyDataGrid" ItemsSource="{Binding MyItems, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" IsReadOnly="True" />
</DockPanel>
</Window>
代码隐藏(添加按钮处理程序以测试此行为)
public partial class MainWindow : Window
{
public MainWindow()
{
DataContext = new MyViewModel();
InitializeComponent();
}
private void TestButton_Click(object sender, RoutedEventArgs e)
{
(DataContext as MyViewModel).MyItems.Remove(MyDataGrid.SelectedItems[2] as MyObject);
}
}
模型(简单类)
public class MyObject
{
public string Name { get; set; }
public int Age { get; set; }
public MyObject(string name, int age)
{
Name = name;
Age = age;
}
}
答案 0 :(得分:0)
添加数据网格刷新并在删除后进行焦点。
private void TestButton_Click(object sender, RoutedEventArgs e)
{
(DataContext as MyViewModel).MyItems.Remove(MyDataGrid.SelectedItems[2] as MyObject);
MyDataGrid.Items.Refresh();
MyDataGrid.Focus();
}
答案 1 :(得分:0)
每当选定的一行被删除时,就会调用2个事件:
首先调用DataGrid.SelectedCellsChanged,然后在SelectedCellsChangedEventArgs中调用.RemovedItems是行中需要删除的行之后的所有单元格。之后的这一行不需要选择,但如果是,那么它会丢失我认为不能按预期工作的选定行样式。
DataGrid.SelectionChanged被调用为second,而在SelectionChangedEventArgs.RemovedItems中仅包含即将被删除的行(按预期工作)。