我无法理解处理 DataGrid 与 ListView 之间的双向绑定的差异。为了说明,我有一个具有一些属性的 DataItem 类,以及一个用于绑定到 DataGrid/ListView 的 DataItem 列表:
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 对象到 SubList 中。主 DataItem 设置为包含 Grid 的 DataContext,SubList 绑定到 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:
<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 和 DataGrid 都正确显示了 SubList 项。但是,当我在 UI 中修改数据并检查源 DataItem.SubList 时,ListView 工作而 DataGrid 不工作:我可以在 ListView 中看到更改,但在DataGrid,没有变化。
绑定必须正确,否则我将看不到正确显示的值。但是由于某种原因,双向绑定在 ListView 中起作用,将 UI 中所做的更改移回源对象,而不是在 DataGrid 中。