【问题标题】:Why do tab controls reuse View instances when changing tab为什么选项卡控件在更改选项卡时重用视图实例
【发布时间】:2011-06-26 23:05:19
【问题描述】:

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

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

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

我观察到的奇怪行为是,当我在不同类型的两个选项卡之间切换时,会创建一个新的用户控件实例。当我在相同类型的两个选项卡之间进行更改时,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>

【问题讨论】:

    标签: wpf wpf-controls binding


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-18
      • 1970-01-01
      • 2016-01-08
      • 1970-01-01
      相关资源
      最近更新 更多