4

私は何か奇妙なことを発見しました: 同じコレクションにバインドされた 2 つのデータグリッドを持つフォームがあります。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; }
}

私の質問は、この動作の理由は何ですか?

4

1 に答える 1

2

素晴らしい質問ヨハン!私の推測では、明示的に a を提供していないためCollectionViewSource、自動的に生成された cvs byDataGridは、同じソースを参照しているため、2 つの間で共有されます。

IsReadOnlyしたがって、2 つの割り当てを発行し、共有ソースである場合、最後の設定が優先され、どちらもDataGrid同じ効果を示します。

私の推測を確認するために、私はこのコードを使用し、DataGrids明示的に動作するように提供したときに期待どおりに動作しますCollectionViewSource

<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>

編集: さらにテストを行った結果、動作が奇妙であるとしか言いようがないことが示されました! これが 3 つの読み取り専用 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 のさらに多くの組み合わせの後、私が気づいた唯一の一貫したことは、Last IsReadOnlyinDataGridが True に設定されている場合、他のすべてDataGridsが読み取り専用になることです。ただし、最後のものが false に設定されている場合、他のすべての DataGrid は独自の IsReadOnly 設定に従って動作します。この動作は、おそらくこのMSDN ビットが原因である可能性があります

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.
于 2012-12-11T11:51:20.797 に答える