2012-05-03 63 views
0

自定義的TabItem自定義的TabItem:可關閉的選項卡,並釋放內存關閉

我有一個TabControl綁定到我的視圖模型我也想刪除的標籤,但我不能看到canges中的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> 

在我的ViewModel

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

什麼想法?

回答

1

除非他們的DataContext已被清除(這看起來像是一種黑客),WPF控件往往不會正確地處理它們。試試這個:

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

    tab.DataContext = null; 

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

另外,請注意,您可能不看到內存立即發佈。由於垃圾收集在.NET中的工作方式,您的應用程序可能需要等待/其他事件才能實際發生垃圾收集並清除內存。

如果你真的對,你可以調用GC.Collect(),但我會做到這一點只有,如果你不相信的內存被釋放我只會把它放在調試並確保對象被釋放。確認後,將其刪除並允許垃圾收集器完成其工作。

+0

我會試着檢查 – rkmax