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

时间:2011-07-14 14:19:36

标签: c# wpf xaml datagrid itemssource

我有一个WPF应用程序,它有两个共享相同ItemsSource的DataGrids。当我将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;
        }
    }
}

1 个答案:

答案 0 :(得分:6)

我认为正在发生的事情是IsReadOnly属性正在通过DataGrid的DefaultView使persons只读,因为这两个{{}}的默认视图相同1}},两者都失去了添加新行的能力。

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

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

DataGrid's

您可以将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