Xaml 自定义选项卡项:可关闭选项卡并在关闭时释放内存

Xaml 自定义选项卡项:可关闭选项卡并在关闭时释放内存,xaml,mvvm,Xaml,Mvvm,自定义选项卡项 我的ViewModel绑定了一个TabControl,我也想删除选项卡,但如果没有更改,我看不到选项卡项的默认值 <TabControl Margin="5 5 5 0" Grid.Row="1" ItemsSource="{Binding Path=ListTabItem}" SelectedIndex="{Binding Path=CurrentTabItemIndex}" x:Na

自定义选项卡项

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

    <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>

在我的ViewModel中

    CloseTabCommand = new RelayCommand<TabItem>(tab =>
    {
        if (null == tab) return;
        ListTabItem.Remove(tab);
    },
    tab =>
    {
        return ListTabItem.IndexOf(tab) == CurrentTabItemIndex;
    });
CloseTabCommand=newrelaycommand(tab=>
{
if(null==tab)返回;
ListTabItem.Remove(选项卡);
},
选项卡=>
{
返回ListTabItem.IndexOf(tab)=CurrentTabItemIndex;
});

有什么想法吗?WPF控件倾向于不适当地处理自己,除非它们的DataContext被清除(这似乎是一种黑客行为)。试试这个:

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

    tab.DataContext = null;

    ListTabItem.Remove(tab);
},
tab =>
{
    return ListTabItem.IndexOf(tab) == CurrentTabItemIndex;
});
CloseTabCommand=newrelaycommand(tab=>
{
if(null==tab)返回;
tab.DataContext=null;
ListTabItem.Remove(选项卡);
},
选项卡=>
{
返回ListTabItem.IndexOf(tab)=CurrentTabItemIndex;
});
此外,请记住,您可能不会看到内存立即释放。由于垃圾收集在.NET中的工作方式,您的应用程序可能需要等待/其他事件,以便实际发生垃圾收集并清除内存

如果你真的想调用GC.Collect(),但是如果你不相信内存正在被释放,我会这样做,并且我只会把它放进去调试并确保对象被释放。确认后,将其移除,并让垃圾收集器执行其工作