2011-07-14 27 views
2

同じItemsSourceを共有する2つのDataGridを持つWPFアプリケーションがあります。 DataGridのIsReadOnlyプロパティのいずれかをtrueに設定すると、他のDataGridにレコードを追加する機能が失われます。私はまだ2番目のデータグリッドの内容を編集できますが、レコードを追加することはできません。WPF:2つのDataGrid、同じItemsSource、1つのIsReadOnly、Bug?

これは対象ですか?これを回避する方法はありますか?私はIsEnabled = "False"をDataGridに使うことができましたが、その中でスクロールする能力を失います。ここで

はセットアップです:

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; 
     } 
    } 
} 
+0

はあなたがレコードを追加意味するか、あなたのために別々のListViewCollection'sをあなたはObservableCollectionListを変更することで、好きなように動作し、使用して取得することができます

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

を真として出てきますプログラムで(つまり、MainWindowのコンストラクタのようにC#経由で)? –

+0

IsReadOnlyモードのDataGridには、通常、レコードを追加するために使用できる空の行があります。この空の行は、このインスタンスでは使用できなくなります。プログラムでレコードを追加しようとしたことはありません。 – Khan

+0

おそらくdgBのデータバインディングを一方向に設定していますか? –

答えて

5

私は何が起こっているのだと思うがIsReadOnlyプロパティが通過読み取り専用DataGridをしているということですpersonsのDefaultViewと、このDefaultViewが両方のDataGrid'sのうち、両方とも新しい行を追加できなくなります。

しかし、(あなたの質問で言ったように)どちらも読み込み専用にならないので、これはバグか望む動作か分かりません。

また、この動作の原因となっている舞台裏で何が起こっているのかよく分かりませんが、(CollectionViewプロパティがプライベートなので)デバッガでCollectionViewが同じであることを確認できます。以下の3つのステートメントは、あなたはそれがDataGrid's

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

+1何が起こっているのか理解してくれます。しかし、それは私に望ましい機能を与えません。 2番目のグリッドには最初のグリッドのすべてが含まれていて、最初のグリッドがあればいつでも変更することができます。最初のグリッドでアイテムを編集すると、2番目のグリッドで変更されます。しかし、残念ながら、最初のグリッドでレコードを追加または削除しても、2番目のグリッドには影響しません。 – Khan

+0

@Jeff: 'List'を' ObservableCollection'に変更しましたか?私はちょうどこれを試して、それは編集セルと行の追加/削除の両方のために動作します –

+1

私はそれを逃した!それは素晴らしい作品です!ありがとうございました! – Khan

関連する問題