0

自定义选项卡项

我有一个绑定到我的 ViewModel 的 TabControl 我也想删除选项卡,但我看不到 tabitems 看到的默认值没有更改

    <TabControl
        Margin="5 5 5 0"
        Grid.Row="1"
        ItemsSource="{Binding Path=ListTabItem}"
        SelectedIndex="{Binding Path=CurrentTabItemIndex}"
        x:Name="Workspace" Background="White">
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="SelectionChanged">
                <cmd:EventToCommand
                Command="{Binding ChangeTabCommand}"
                CommandParameter="{Binding SelectedItem, ElementName=Workspace}"/>
            </i:EventTrigger>
        </i:Interaction.Triggers>
        <!--Here is my tabHeader-->
        <TabControl.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding Header}" />                        
                    <Button Content="X" Command={Binding CloseTabCommand}
                      CommandParameter="{Binding SelectedItem, ElementName=Workspace}"/>
                </StackPanel>
            </DataTemplate>
        </TabControl.ItemTemplate>            
    </TabControl>

编辑:

我得到了一种工作方式,但是当关闭选项卡不释放内存时我遇到了问题:

    <Style x:Key="HeaderTabItem" TargetType="TabItem">
        <Setter Property="HeaderTemplate">
            <Setter.Value>
                <DataTemplate>
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="*" />
                            <ColumnDefinition Width="Auto" />
                        </Grid.ColumnDefinitions>
                        <Button                                
                            Width="20"
                            Height="20"
                            Margin="-3 0 5 0"
                            Padding="2"
                            HorizontalAlignment="Left"
                            VerticalAlignment="Center"
                            BorderBrush="{x:Null}" Background="{x:Null}" Foreground="{x:Null}"
                            DataContext="{Binding DataContext, ElementName=Workspace}"
                            Command="{Binding Path=CloseTabCommand}"
                            CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=TabItem, AncestorLevel=1}}" Content="X"/>
                        <ContentControl
                            Grid.Column="1" 
                            VerticalAlignment="Center"
                            HorizontalAlignment="Left"
                            Content="{Binding Path=Header, RelativeSource={RelativeSource FindAncestor, AncestorType=TabItem, AncestorLevel=1}}" />
                    </Grid>
                </DataTemplate>
            </Setter.Value>
        </Setter>
    </Style>

在我的视图模型中

    CloseTabCommand = new RelayCommand<TabItem>(tab =>
    {
        if (null == tab) return;
        ListTabItem.Remove(tab);
    },
    tab =>
    {
        return ListTabItem.IndexOf(tab) == CurrentTabItemIndex;
    });

有任何想法吗?

4

1 回答 1

1

WPF 控件往往不会适当地处理自己,除非它们的 DataContext 已被清除(这似乎是一种黑客行为)。试试这个:

CloseTabCommand = new RelayCommand<TabItem>(tab =>
{
    if (null == tab) return;

    tab.DataContext = null;

    ListTabItem.Remove(tab);
},
tab =>
{
    return ListTabItem.IndexOf(tab) == CurrentTabItemIndex;
});

另外,请记住,您可能看不到立即释放的内存。由于垃圾收集在 .NET 中的工作方式,您的应用程序可能需要等待/其他事件才能真正发生垃圾收集并清除内存。

如果你真的想要,你可以调用 GC.Collect(),但我只会在你不相信内存被释放的情况下才会这样做我只会将它放入调试并确保对象被释放。确认后,将其删除并允许垃圾收集器完成其工作。

于 2012-05-15T19:11:16.153 回答