2013-11-05 174 views
0

我無法理解DataGrid與ListView之間雙向綁定的處理差異。爲了說明,我有一個類的DataItem具有幾個特性,並DataItems的用於結合到DataGrid/ListView的列表:雙向綁定DataGrid與ListView

public class DataItem 
{ 
    public bool Flag { get; set; } 
    public int IntValue { get; set; } 
    public string StringValue { get; set; } 

    public List<DataItem> SubList { get; set; } 

    public DataItem()[...] 

} 

創建與一些附加的DataItem對象的主要的DataItem對象ADDE到子列表。主的DataItem被設定爲包含網格的DataContext的,並且子列表綁定到既一個ListView:

  <ListView ItemsSource="{Binding Path=SubList}"> 
       <ListView.View> 
        <GridView> 
         <GridViewColumn Header="Flag" Width="Auto"> 
          <GridViewColumn.CellTemplate> 
           <DataTemplate> 
            <CheckBox Name="FlagCheckBox" IsChecked="{Binding Path=Flag}" /> 
           </DataTemplate> 
          </GridViewColumn.CellTemplate> 
         </GridViewColumn> 
         <GridViewColumn Header="String Value" Width="100"> 
          <GridViewColumn.CellTemplate> 
           <DataTemplate> 
            <TextBox Name="StringTextBox" Text="{Binding Path=StringValue}" /> 
           </DataTemplate> 
          </GridViewColumn.CellTemplate> 
         </GridViewColumn> 
        </GridView> 
       </ListView.View> 
      </ListView> 

和到數據網格:

  <DataGrid ItemsSource="{Binding Path=SubList}" AutoGenerateColumns="False"> 
       <DataGrid.Columns> 
        <DataGridTemplateColumn Header="Flag" Width="SizeToCells"> 
         <DataGridTemplateColumn.CellTemplate> 
          <DataTemplate> 
           <CheckBox Name="FlagCheckBox" IsChecked="{Binding Path=Flag}" /> 
          </DataTemplate> 
         </DataGridTemplateColumn.CellTemplate> 
        </DataGridTemplateColumn> 
        <DataGridTemplateColumn Header="String Value" Width="SizeToCells"> 
         <DataGridTemplateColumn.CellTemplate> 
          <DataTemplate> 
           <TextBox Name="StringTextBox" Text="{Binding Path=StringValue}" /> 
          </DataTemplate> 
         </DataGridTemplateColumn.CellTemplate> 
        </DataGridTemplateColumn> 
       </DataGrid.Columns> 
      </DataGrid> 

兩者ListView和數據網格適當地顯示子清單項目。但是,當我修改UI中的數據並檢查源DataItem.SubList時,ListView工作並且DataGrid沒有:我可以在ListView中看到這些更改,但是當更改在DataGrid沒有變化。

綁定必須是正確的,否則我不會看到值正確顯示。但出於某種原因,雙向綁定在ListView中將把UI中所做的更改移回源對象,但不會在DataGrid中。

回答

0

在DataGrid的情況下,您需要設置UpdateSourceTriggerPropertyChanged以將更改傳播回DataObject類。

<CheckBox Name="FlagCheckBox" IsChecked="{Binding Path=Flag, 
              UpdateSourceTrigger=PropertyChanged}"/> 

而且在文本框太 -

<TextBox Name="StringTextBox" Text="{Binding Path=StringValue, 
             UpdateSourceTrigger=PropertyChanged}"/> 
+0

謝謝,這看起來像它的工作原理。奇怪的是,UpdateSourceTrigger的默認設置是不更新源。 – garzooma