WPF:两个DataGrids,相同的ItemsSource,一个IsReadOnly,Bug?

我有一个WPF应用程序,它有两个共享相同ItemsSource的DataGrids。 当我将DataGrid的一个IsReadOnly属性设置为true时,我将无法将记录添加到其他DataGrid。 我仍然可以编辑第二个数据网格的内容,但只是无法添加记录。

这是有意的吗? 有没有办法解决这个问题? 我可以对DataGrid使用IsEnabled =“False”,但我失去了滚动它的能力。

这是设置:

XAML:

                  

C#:

 public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); List persons = new List(); persons.Add(new Person() { FirstName = "Bob", LastName = "Johnson" }); persons.Add(new Person() { FirstName = "John", LastName = "Smith" }); dgA.ItemsSource = persons; dgB.ItemsSource = persons; } class Person { public Person() { } public string FirstName { get; set; } public string LastName { get; set; } } } 

我认为正在发生的事情是IsReadOnly属性通过DefaultView为persons创建DataGrid ,并且因为这两个DataGrid's DefaultView都是相同DataGrid's ,所以两者都失去了添加新行的能力。

然而,两者都不会变成只读(正如你在问题中所说的那样)所以我不确定这是一个错误还是一个想要的行为。

我也不确定这里会发生什么导致这种行为,但你可以通过调试器validationCollectionView是否相同(因为CollectionView属性是私有的)。 以下三个陈述是真实的

 dgA.Items.CollectionView == CollectionViewSource.GetDefaultView(persons) // true dgB.Items.CollectionView == CollectionViewSource.GetDefaultView(persons) // true dgA.Items.CollectionView == dgB.Items.CollectionView // true 

您可以通过将List更改为ObservableCollection并为DataGrid's使用单独的ListViewCollection's来让它以您喜欢的方式工作

 public MainWindow() { InitializeComponent(); ObservableCollection persons = new ObservableCollection(); persons.Add(new Person() { FirstName = "Bob", LastName = "Johnson" }); persons.Add(new Person() { FirstName = "John", LastName = "Smith" }); dgA.ItemsSource = new ListCollectionView(persons); dgB.ItemsSource = new ListCollectionView(persons); }