Grid.Children.Clear()真的删除了所有控件吗?

时间:2016-07-26 14:11:43

标签: c# wpf

编辑:
简单回答:是的,确实如此。每次Combobox_SelectionChanged被触发时,我都发现了错误,即添加了另一个事件处理程序。因此,该集合看起来很好,但Items_CollectionChanged被多次触发。一旦修复,一切正常 结束编辑。

我有一个带有组合框和网格的页面。当组合框中的选择发生变化时,网格会动态填充。我现在正在观察一件奇怪的事情。当我在组合框中第二次选择一个值时,网格中的子项目会出现两次。我检查了底层集合,看起来很好(即每个项目只有一个记录)。当我跳出combobox_SelectionChanged方法时,在Grid.Children.Clear()命令之后,屏幕看起来很好,即空。

我的猜测是,Grid.Children.Clear()仅从可视树中删除了控件,但实际的控件仍然悬而未决。任何想法?

private void combobox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    grItems.Children.Clear();
    grItemsColumnDefinitions.Clear();
    grItemsColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(200) });
}

    private void Items_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {

        if (e.Action == NotifyCollectionChangedAction.Add)
        {
             grItems.Children.Add(new ChildItemControl(e.NewItems[0]));
        }

    } 

编辑:整个事情应该看起来像这样(虚构 - 但希望可以理解 - 例子) enter image description here

1 个答案:

答案 0 :(得分:1)

我建议你使用WPF的内置数据绑定。你可以使用这样的东西:

<DataGrid x:Name="grItems" ItemsSource="{Binding comboboxItems}" />

然后,当您更新comboboxItems时,您的网格也会自动更新! 这是一篇关于使用DataGrid控件进行数据绑定的精彩文章: http://www.wpftutorial.net/DataGrid.html

有关数据绑定的更多信息,请参阅以下文章:https://msdn.microsoft.com/en-us/library/aa480224.aspx