使用DataGrid与ListView进行双向绑定

时间:2013-11-05 02:45:50

标签: wpf listview datagrid

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

1 个答案:

答案 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}"/>