3

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

这是故意的吗?有没有办法解决这个问题?我可以对 DataGrid 使用 IsEnabled="False",但是我无法在其中滚动。

这是设置:

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

1 回答 1

6

我认为发生的事情是该IsReadOnly属性正在DataGrid通过 DefaultView for 进行只读persons,并且由于您的两个 DefaultView 都将相同,因此两者DataGrid's都失去了添加新行的能力。

但是,两者都不会变成只读的(正如您在问题中所说),因此我不确定这是错误还是期望的行为。

我也不确定导致此行为的幕后发生了什么,但您可以通过调试器验证 CollectionView 是否相同(因为 CollectionView 属性是私有的)。以下三个陈述是正确的

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

您可以通过将其更改List为 anObservableCollection并单独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);
}
于 2011-07-14T15:19:46.000 回答