删除选中的行后,DataGrid的SelectedItems和突出显示的行不同步

时间:2016-07-27 15:27:21

标签: c# wpf mvvm datagrid

我将DataGrid与ItemsSource绑定到ViewModel中的ObservableCollection。 DataGrid允许选择多行。 ViewModel订阅一个事件(来自某个服务)并处理该事件包括从ObservableCollection中删除一个对象。如果该对象是选定对象之一,则DataGrid中突出显示的行会发生奇怪的事情。我不知道如何解释它,所以这是一个图像

image

以下是重现问题的代码。工具栏上添加了删除第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;
    }
}

2 个答案:

答案 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中仅包含即将被删除的行(按预期工作)。