WPF TabControl和DataGrid错误,错误和错误

时间:2013-11-09 14:07:32

标签: wpf binding datagrid tabcontrol

对于每个人来说,我发现了WPF,TabControl和DataGrid的不同问题。特别是如果TabControl ItemsSource被绑定。

我发现的问题:

  • 在切换Tabs来回后,DataGrid中的选择不可见
  • DataGrid在Tab键上切换排序(CollectionView.GetDefaultCollection的SortDescriptions在卸载时清除)
  • 如果DataGrid单元格具有焦点(处于编辑模式)并且您单击另一个选项卡,则可能发生以下两种情况:1。)绑定对象不会更新; 2.)如果对象无效,则会在编辑期间收到错误DeferRefresh,或类似
  • 如果您使用绑定的TabControls和DataTemplates切换到另一个选项卡,DataGridComboBox和可能的其他控件会清除它们的值。这清除了任何选择。

现在我的问题是:在这种情况下,是否有任何ThirdParty控件表现更好?

您也可以在这里投票http://connect.microsoft.com/VisualStudio/feedback/details/807849/databound-tabcontrol-bugs

我从微软那里得到了答案,因为没有足够的人解决这个问题。 我知道一些修复,但它们有些真的不干净(例如使用反射)。也许你有一些想法?

2 个答案:

答案 0 :(得分:0)

嗯,有趣的帖子虽然我敢打赌,所有没有错误。我认为微软甚至没有看过这些东西。他们可能永远不会。如果您可以发布或上传所有这些问题的代码,我可能会认为它们都是错误的错误,我将非常感激。

顺便说一下,TabControl ItemsSource是什么意思?

以下是我对您在问题中提供的信息的反馈。 1)你选择的东西,你在任何地方点击,无论是tabitem还是其他窗口,你都会失去焦点,选择将变为无效意味着略带灰色的颜色。 2)卸载意味着从VisualTree中删除控件,因此必须清除CollectionView以释放内存。这很好,因为你不想要内存泄漏。 3)如果单元格的编辑模板包含控件,这些控件将在焦点丢失时更新绑定的源,那么肯定会发生。如果您恰好使用TabItems的模板,那么模板将主要被重用(具有相同实例的方式),因此您可能最终将座位远离DataGrid'屁股,这更不是一个错误而是您不想要的东西也发生在你身上。因此,在编辑单元格时,DataGrid可能会大喊“哟,不要傻瓜”。 4)与#3相同,它取决于你在做什么以及如何定义模板。主要考虑模板是否在带有密钥的资源中,然后模板将被重用。

请发布我们的代码,让我们一起来看看。我打赌你可能会做一些非常“不太可能”的事情。 :)

如果这些事情恰好是“手推车”(其他人审查相同的行为),我打赌他们有解决方法。 :)

我个人觉得所有这些事情都发生了,因为你正在使用数据绑定TabControl。无论这意味着什么。我很高兴看到什么是数据绑定TabControls以及它们如何绑定?你如何定义这些模板。

答案 1 :(得分:0)

我有同样的问题。

修复DataGridComboBox问题可能是指定ComboBox的ItemsSource作为TabControl的DataContext属性而不是DataGrid,因为当您选择另一个选项卡时,DataGrid将从可视树中删除:

    <TabControl x:Name="tabControl" Behaviours:TabContent.IsCached="True">
        <TabItem Header="Tab1" Content="{Binding}" ContentTemplate="{StaticResource Tab1}"/>
        <TabItem Header="Tab2" Content="{Binding}" ContentTemplate="{StaticResource Tab2}"/>
    </TabControl>

    <DataTemplate x:Key="Tab1">
        <DataGrid ItemsSource="{Binding Entities}" x:Name="dataGrid">
            <DataGrid.Columns>
                <DataGridTextColumn Binding="{Binding Name}" Header="Name" Width="100"/>
                <DataGridTemplateColumn Header="Position" Width="150">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding Position}"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                    <DataGridTemplateColumn.CellEditingTemplate>
                        <DataTemplate>
                            <ComboBox SelectedItem="{Binding Position, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
                                      ItemsSource="{Binding Path=DataContext.Positions, ElementName=tabControl}"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellEditingTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>
    </DataTemplate>