0

我无法理解处理 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 中。

4

1 回答 1

0

在 DataGrid 的情况下,您需要设置UpdateSourceTriggerPropertyChanged将更改传播回您的 DataObject 类。

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

在 TextBox 上也是 -

<TextBox Name="StringTextBox" Text="{Binding Path=StringValue, 
                                         UpdateSourceTrigger=PropertyChanged}"/>
于 2013-11-05T08:48:32.213 回答