WPF: две DataGrids, один и тот же ItemsSource, один IsReadOnly, ошибка? - PullRequest
3 голосов
/ 14 июля 2011

У меня есть приложение WPF с двумя DataGrids, которые используют один и тот же ItemsSource. Когда я устанавливаю для одного из свойств IsReadOnly объекта DataGrid значение true, я теряю возможность добавлять записи в другой DataGrid. Я все еще могу редактировать содержимое второй таблицы данных, но просто не могу добавлять записи.

Это предназначено? Есть ли способ обойти это? Я мог бы использовать IsEnabled = "False" для DataGrid, но затем потерял возможность прокручивать его.

Вот настройка:

XAML:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>
    <DataGrid Name="dgA" Grid.Row="0" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Header="FirstName" Binding="{Binding Path=FirstName}" />
            <DataGridTextColumn Header="LastName" Binding="{Binding Path=LastName}" />
        </DataGrid.Columns>         
    </DataGrid>
    <DataGrid Name="dgB" Grid.Row="1" AutoGenerateColumns="False" IsReadOnly="True">
        <DataGrid.Columns>
            <DataGridTextColumn Header="FirstName" Binding="{Binding Path=FirstName}" />
            <DataGridTextColumn Header="LastName" Binding="{Binding Path=LastName}" />
        </DataGrid.Columns>
    </DataGrid>
</Grid>

C #:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        List<Person> persons = new List<Person>();
        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;
        }
    }
}

1 Ответ

6 голосов
/ 14 июля 2011

Я думаю, что происходит то, что свойство IsReadOnly делает DataGrid доступным только для чтения через DefaultView для persons, и поскольку этот DefaultView будет одинаковым для обоих ваших DataGrid's, оба теряют способностьдобавить новые строки.

Однако оба не становятся доступными только для чтения (как вы сказали в своем вопросе), поэтому я не уверен, является ли это ошибкой или желаемым поведением.

I 'Я также не уверен, что происходит за кулисами, что вызывает такое поведение, но вы можете проверить, что CollectionView одинаковы с помощью отладчика (так как свойство CollectionView является частным).Следующие три утверждения выглядят как истинные

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

Вы можете заставить его работать так, как вам нравится, изменив List на ObservableCollection и использовать отдельный ListViewCollection's для вашего DataGrid's

public MainWindow()
{
    InitializeComponent();

    ObservableCollection<Person> persons = new ObservableCollection<Person>();
    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);
}
...