我无法理解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对象,其中包含许多附加到SubList中的其他DataItem对象。主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中看到更改,但是当在ListView中进行更改时DataGrid,没有任何变化。
绑定必须正确,否则我不会看到正确显示的值。但由于某种原因,双向绑定在ListView中工作,以将UI中所做的更改移回源对象,但不会移动到DataGrid中。
答案 0 :(得分:0)
在DataGrid的情况下,您需要将UpdateSourceTrigger
设置为PropertyChanged
以将更改传播回DataObject类。
<CheckBox Name="FlagCheckBox" IsChecked="{Binding Path=Flag,
UpdateSourceTrigger=PropertyChanged}"/>
在TextBox上也是 -
<TextBox Name="StringTextBox" Text="{Binding Path=StringValue,
UpdateSourceTrigger=PropertyChanged}"/>