WPF: Dois DataGrids, mesmo ItemsSource, um IsReadOnly, Bug?

Eu tenho um aplicativo WPF com dois DataGrids que compartilham o mesmo ItemsSource. Quando defino uma propriedade IsReadOnly do DataGrid como true, perco a capacidade de adicionar registros ao outro DataGrid. Ainda posso editar o conteúdo do segundo datagrid, mas simplesmente não consigo adicionar registros.

Isso é pretendido? Existe maneira de contornar isso? Eu poderia usar IsEnabled = “False” para o DataGrid, mas então eu perco a capacidade de rolar nele.

Aqui está a configuração:

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; } } } 

Eu acho que o que está acontecendo é que a propriedade IsReadOnly está fazendo o DataGrid readonly através do DefaultView para persons , e desde que este DefaultView será o mesmo para ambos os seus DataGrid's , ambos perde a capacidade de adicionar novas linhas.

Ambos não se tornam apenas leitura (como você disse na sua pergunta), então eu não tenho certeza se isso é um bug ou um comportamento desejado.

Eu também não tenho certeza do que está acontecendo nos bastidores aqui que causa esse comportamento, mas você pode verificar se os CollectionView são os mesmos através do depurador (desde que a propriedade CollectionView é particular). As três declarações a seguir saem como verdadeiras

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

Você pode fazê-lo funcionar do jeito que você gosta, alterando a List para um ObservableCollection e usar separado ListViewCollection's para seu DataGrid'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); }