0

对于每个人,我发现 WPF、TabControl 和 DataGrid 存在不同的问题。特别是如果 TabControl ItemsSource 已绑定。

我发现的问题:

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

所以现在我的问题是:是否有任何第三方控件在这种情况下表现更好?

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

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

4

2 回答 2

0

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

顺便说一句,绑定 TabControl ItemsSource 是什么意思?

这是我从您在问题中提供给我们的信息中对此的反馈。1)你选择了某个东西,你在任何地方点击离开,无论是tabitem还是另一个窗口,你都会失去焦点,选择会变成不活动的意思是略带灰色的颜色。2)卸载意味着从 VisualTree 中删除一个控件,因此必须清除 CollectionView 以释放内存。这很好,因为您不希望内存泄漏。3) 如果单元格的编辑模板包含在焦点丢失时更新绑定源的控件,那么肯定会发生这种情况。如果您碰巧为 TabItems 使用模板,那么该模板将大部分被重用(意味着具有相同的实例),因此您最终可能会从 DataGrid 的屁股上拿走座位,这不是错误,而是您不喜欢的东西发生在你身上。因此,DataGrid 可能会大喊“哟,在我编辑单元格时不要胡闹”。4) 与 #3 相同,这取决于您在做什么以及如何定义模板。主要考虑如果模板在具有键的资源中,则模板将被重用。

请向我们发布代码,让我们看看。我敢打赌你可能会做一些非常“wpf-unlikely”的事情。:)

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

就我个人而言,我感觉所有这些事情都会发生,因为您使用的是数据绑定 TabControl。不管那可能意味着什么。我很高兴看到什么是数据绑定 TabControls 以及它们是如何绑定的?你如何定义这些模板。

于 2013-11-09T20:56:16.713 回答
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>
于 2014-03-12T10:17:26.850 回答