gpt4 book ai didi

wpf - ReadWrite 和 ReadOnly 数据网格绑定(bind)到共享源,导致 ReadWrite 不是正确的 ReadWrite?

转载 作者:行者123 更新时间:2023-12-02 22:27:14 26 4
gpt4 key购买 nike

我发现了一些奇怪的事情:我有一个带有两个数据网格的表单,它们绑定(bind)到同一个集合。根据 Xaml 中数据网格的顺序,行为会有所不同。

这按预期工作(存在用于添加的额外行):

<DockPanel>
<DockPanel DockPanel.Dock="Right">
<Label Content="ReadOnlyView" DockPanel.Dock="Top"/>
<DataGrid ItemsSource="{Binding Persons}" IsReadOnly="True" />
</DockPanel>
<DockPanel>
<Label Content="EditorView" DockPanel.Dock="Top" />
<DataGrid ItemsSource="{Binding Persons}" IsReadOnly="False" CanUserAddRows="True" />
</DockPanel>
</DockPanel>

以这种方式排列 xaml 让我感到困惑(没有额外的行用于添加)

<DockPanel>
<DockPanel>
<Label Content="EditorView" DockPanel.Dock="Top" />
<DataGrid ItemsSource="{Binding Persons}" IsReadOnly="False" CanUserAddRows="True" />
</DockPanel>
<DockPanel DockPanel.Dock="Right">
<Label Content="ReadOnlyView" DockPanel.Dock="Top"/>
<DataGrid ItemsSource="{Binding Persons}" IsReadOnly="True" />
</DockPanel>
</DockPanel>

下面是我用于此目的的虚拟 ViewModel:

public class PersonsViewModel
{
public PersonsViewModel()
{
Persons = new ObservableCollection<Person>
{
new Person {Name = "Johan"},
new Person {Name = "Dave"},
};
}

public ObservableCollection<Person> Persons { get; private set; }
}

public class Person
{
public string Name { get; set; }
}

我的问题是这种行为的原因是什么?

最佳答案

约翰,这是一个很好的问题!我的猜测是,由于您没有明确为其提供 CollectionViewSource,由 DataGrid 自动生成的 cv 在两者之间共享,因为您引用的是同一源。

因此,当您发出两个 IsReadOnly 分配并且作为共享源时,最后一个设置获胜,两个 DataGrid 都会显示相同的效果。

为了证实我的猜测,我使用了这段代码,当您为它们提供显式的 CollectionViewSource 来使用时,DataGrids 的行为正如您所期望的那样。

<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<CollectionViewSource Source="{Binding Persons}" x:Key="cvs1" />
<CollectionViewSource Source="{Binding Persons}" x:Key="cvs2" />
</Window.Resources>
<DockPanel>
<DataGrid ItemsSource="{Binding Source={StaticResource ResourceKey=cvs1}}" IsReadOnly="False" CanUserAddRows="True" />
<DataGrid ItemsSource="{Binding Source={StaticResource ResourceKey=cvs2}}" IsReadOnly="True" />
</DockPanel>
</Window>

编辑:进一步测试表明该行为可以被描述为奇怪!我无法解释为什么这会产生三个只读 DG

<DataGrid ItemsSource="{Binding Persons}" IsReadOnly="True" />
<DataGrid ItemsSource="{Binding Persons}" IsReadOnly="False" />
<DataGrid ItemsSource="{Binding Persons}" IsReadOnly="True" />

但这会产生交替的只读和可编辑 DG:

<DataGrid ItemsSource="{Binding Persons}" IsReadOnly="True" />
<DataGrid ItemsSource="{Binding Persons}" IsReadOnly="False" />
<DataGrid ItemsSource="{Binding Persons}" IsReadOnly="True" />
<DataGrid ItemsSource="{Binding Persons}" IsReadOnly="False" />

所以我想上面的 CVS 最好被描述为这种奇怪行为的解决方法,这样你就可以实现你真正想要的。

编辑2:在更多 true false 组合之后,我注意到的唯一一致的事情是,如果 DataGrid 中的 Last IsReadOnly 设置为 True,则所有其他 DataGrid 变为只读。但如果最后一个设置为 false,则所有其他 DataGrid 都会根据自己的 IsReadOnly 设置进行操作。此行为可能是由于此 MSDN bit

If a conflict exists between the settings at the DataGrid, column,
or cell levels, a value of true takes precedence over a value of false.

关于wpf - ReadWrite 和 ReadOnly 数据网格绑定(bind)到共享源,导致 ReadWrite 不是正确的 ReadWrite?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13808143/

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