2013-11-05 123 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