2011-07-14 17 views
2

我有一個WPF應用程序與兩個DataGrid共享相同的ItemsSource。當我將其中一個DataGrid的IsReadOnly屬性設置爲true時,我失去了將記錄添加到其他DataGrid的功能。我仍然可以編輯第二個數據網格的內容,但不能添加記錄。WPF:兩個DataGrids,相同的ItemsSource,一個IsReadOnly,Bug?

這是打算?有沒有辦法解決這個問題?我可以爲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; 
     } 
    } 
} 
+0

你的意思是添加記錄以編程方式(即通過在MainWindow構造函數中的C#)? –

+0

DataGrid出於IsReadOnly模式通常有一個可用於添加記錄的空行。此空白行在此實例中不再可用。我沒有嘗試以編程方式添加記錄。 – Khan

+0

可能爲dgB設置單向數據綁定? –

回答

5

我認爲,這是怎麼回事是,IsReadOnly屬性是通過使DataGrid只讀DefaultView爲persons,並且由於這個DefaultView對於兩者都是相同的你的DataGrid's,都失去了添加新行的能力。

然而,這兩者都不會變爲只讀(就像您在您的問題中所述),所以我不確定這是錯誤還是期望的行爲。

我也不確定幕後會發生什麼情況,導致此行爲,但您可以通過調試器驗證CollectionView是否相同(因爲CollectionView屬性是私人的)。下面的三個語句出來的真

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

你可以得到它的工作通過更改ListObservableCollection喜歡的方式,並使用單獨的ListViewCollection'sDataGrid'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幫助我瞭解發生了什麼事。但是這並沒有給我所需的功能。我希望第二個網格包含第一個網格所做的所有事情,以及每當第一個網格發生變化時都會進行更改。當我編輯第一個網格中的項目時,它在第二個網格中發生變化。但不幸的是,在第一個網格中添加或刪除記錄不會影響第二個網格。 – Khan

+0

@Jeff:你是否把'List'改爲'ObservableCollection'?我只是試過這個,它適用於編輯單元格和添加/刪除行 –

+1

我錯過了!它很棒!謝謝! – Khan

相關問題