【问题标题】:Two way binding with a DataGrid vs. a ListView两种方式绑定 DataGrid 与 ListView
【发布时间】:2013-11-05 02:45:49
【问题描述】:

我无法理解处理 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 中看到更改,但在DataGrid,没有变化。

绑定必须正确,否则我将看不到正确显示的值。但由于某种原因,双向绑定在 ListView 中起作用,将 UI 中所做的更改移回源对象,而不是 DataGrid。

【问题讨论】:

    标签: wpf listview datagrid


    【解决方案1】:

    如果是 DataGrid,您需要将 UpdateSourceTrigger 设置为 PropertyChanged 以将更改传播回您的 DataObject 类。

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

    还有 TextBox -

    <TextBox Name="StringTextBox" Text="{Binding Path=StringValue, 
                                             UpdateSourceTrigger=PropertyChanged}"/>
    

    【讨论】:

    • 谢谢,这看起来可行。奇怪的是 UpdateSourceTrigger 的默认设置是不更新源。
    猜你喜欢
    • 2021-03-01
    • 2015-08-19
    • 2014-11-29
    • 2017-11-18
    • 2011-03-06
    • 1970-01-01
    • 2011-07-18
    • 2013-11-29
    • 2012-03-23
    相关资源
    最近更新 更多