首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >两个DataGrids,相同的ItemsSource,一个IsReadOnly,Bug?

问两个DataGrids,相同的ItemsSource,一个IsReadOnly,Bug?
EN

Stack Overflow用户
提问于 2011-07-14 22:19:36
回答 1查看 2.8K关注 0票数 3

我有一个带有两个共享相同ItemsSource的DataGrids的WPF应用程序。当我将数据网格的一个IsReadOnly属性设置为true时,我失去了向另一个DataGrid添加记录的能力。我仍然可以编辑第二个datagrid的内容,但不能添加记录。

这是故意的吗?有什么办法可以解决这个问题吗?我可以在DataGrid中使用IsEnabled="False“,但这样我就失去了在其中滚动的功能。

下面是设置:

XAML:

代码语言:javascript
复制
<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#:

代码语言:javascript
复制
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;
        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-07-14 23:19:46

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

然而,两者都不是只读的(正如您在问题中所说的),所以我不确定这是一个bug还是一个所需的行为。

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

代码语言:javascript
复制
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来让它以您喜欢的方式工作

代码语言:javascript
复制
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);
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6694703

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档