gpt4 book ai didi

wpf - 为什么选项卡控件在更改选项卡时重用 View 实例

转载 作者:行者123 更新时间:2023-12-03 22:37:00 25 4
gpt4 key购买 nike

我有一个遵循 MVVM 模式的 WPF 项目。

我有一个包含选项卡控件的控件。选项卡控件绑定(bind)到一个可观察的集合。可观察集合中的每个项目都是要显示的特定标签页的 View 模型。

实现选项卡控件的 xaml 文件使用数据模板来选择要显示的特定用户控件,具体取决于可观察集合中 View 模型的具体类型。

我观察到的奇怪行为是,当我在不同类型的两个选项卡之间切换时,会创建一个新的用户控件实例。当我在相同类型的两个选项卡之间进行更改时,WPF 会重用用户控件的相同实例,它只是更改控件上的 DataContext。

这会产生一些非常不幸的后果,例如当在两个相同类型的选项卡之间切换时,但具有不同的视觉状态,则显示视觉状态转换动画,它不应该显示;改变应该是即时的。在不同类型的两个选项卡之间切换时也会出现一些异常。

我可以更改此行为,以便选项卡控件在切换到不同选项卡时为每个选项卡页保存一个用户控件实例,而不是“销毁”控件。

<UserControl.Resources>
<DataTemplate DataType="{x:Type ViewModels:ConcreteViewModel1}" d:IsDataSource="true">
<Views:ConcreteView1 />
</DataTemplate>
<DataTemplate DataType="{x:Type ViewModels:ConcreteViewModel2}" d:IsDataSource="true">
<Views:ConcreteView2/>
</DataTemplate>
...
</UserControl.Resources>

<Grid x:Name="ControlTabLayoutRoot">
<TabControl Grid.Row="0" x:Name="Main_TabControl"
ItemsSource="{Binding MainTabControl}"
SelectedIndex="{Binding SelectedIndex}"
IsSynchronizedWithCurrentItem="True"
HorizontalContentAlignment="Stretch"
VerticalContentAlignment="Stretch"
ItemContainerStyle="{DynamicResource CustomTabItemStyle}"
Style="{DynamicResource CustomTabControl}">
<TabControl.ItemTemplate>
<DataTemplate>
<TextBlock>
<TextBlock.Text>
<MultiBinding Converter="{StaticResource tabItemHeaderConverter}">
<MultiBinding.Bindings>
<Binding/>
<Binding Path="ProtocolName"/>
</MultiBinding.Bindings>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</DataTemplate>
</TabControl.ItemTemplate>
</TabControl>
</Grid>

最佳答案

一个 TabControl在内部回收虚拟化。在这个 StackOverflow 问题中,您可以找到两种不同的方法来防止这种情况发生:

  • WPF TabControl - how to preserve control state within tab items (MVVM pattern)
  • 关于wpf - 为什么选项卡控件在更改选项卡时重用 View 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4993159/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com