gpt4 book ai didi

c# - WPF:两个 DataGrids,相同的 ItemsSource,一个是只读的,Bug?

转载 作者:行者123 更新时间:2023-11-30 14:39:17 25 4
gpt4 key购买 nike

我有一个 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;
}
}
}

最佳答案

我认为正在发生的事情是 IsReadOnly 属性通过 persons 的 DefaultView 使 DataGrid 只读,并且由于此 DefaultView 将对于您的 DataGrid 的 都是一样的,两者都失去了添加新行的能力。

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

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

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

您可以通过将 List 更改为 ObservableCollection 并为您的 使用单独的 ListViewCollection 来让它以您喜欢的方式工作DataGrid 的

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

关于c# - WPF:两个 DataGrids,相同的 ItemsSource,一个是只读的,Bug?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6694703/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com