该程序使用TabControl并且它的每个选项卡都由一个带有表格的用户控件表示DataGrid。
当活动选项卡改变时,ItemsSource每次都重新设置该属性,导致滚动条和表格中所有选中的行都丢失之前的状态,每次加载都需要等待一段时间数据。
代码没有任何变化。
问题是什么?
主窗口:
<TabControl ItemsSource="{Binding Tabs}">
<TabControl.ItemContainerStyle>
<Style TargetType="{x:Type TabItem}">
<Setter Property="Header" Value="{Binding Title}" />
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<wpfTemp:MyDataGrid ItemsSource="{Binding Items}" />
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</TabControl.ItemContainerStyle>
</TabControl>
用户控制:
<DataGrid ItemsSource="{Binding ItemsSource, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}"
SelectionMode="Extended"
AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Number" Binding="{Binding}" />
</DataGrid.Columns>
</DataGrid>
多亏了英文版 SO 上的这个答案,问题才得以解决。谢谢@和尚。
XAML:
代码隐藏:
关键是它
TabControl试图对所有选项卡的内容使用相同的控件。在这方面,视觉状态当然是丢失了。我这样为自己解决了这个问题:
TabControl删除了内容,只留下标签。TabControl留有空间,我不得不在底部添加一个负边距。TabControl'om located下Grid,其中存储了选项卡内容的所有视图,通过切换执行所需的显示Visibility。为了避免手动操作,我使用了标准ItemsControl的“omListBox”技巧。这是完整的代码:
虚拟机类:
DataContext:结果:
在这种情况下,吸气剂只工作一次,这可以在日志中看到。
除了@VladD的回答。
Чтобы при старте приложения первая вкладка по умолчанию была выбрана, в
MainWindowделаем установкуLoaded += (s, e) => TabControlAbove.SelectedIndex = 0;.Также нужно обработать Ctrl+Click по содержимому вкладки, иначе будет срабатывать снятие выделения с текущего
ListBoxItemи содержимое пропадет. Для этого вешаем наListBoxобработчикSelectionChanged="ListBox_SelectionChanged", в котором проверяем, что добавляемый элемент есть: