2013-08-21 25 views
5

Ich benutze AvalonDock mit MVVM in einem WPF-Projekt.WPF - AvalonDock - Closing Document

Wenn ich das "X" (Schließen-Schaltfläche der Registerkarte) drücke, wird mein Dokument geschlossen, bleibt aber im Speicher. Es scheint, dass es nur versteckt ist. Es wird nicht aus meiner Model.Documents Sammlung entfernt.

Wenn ich DockingManager_DocumentClosing hinzufügen und versuche, mein Dokument aus der Sammlung zu entfernen, erhalte ich eine Ausnahme in der folgenden Methode Xceed.Wpf.AvalonDock.Layout.LayoutContent, weil parentAsContainer null ist.

/// <summary> 
/// Close the content 
/// </summary> 
/// <remarks>Please note that usually the anchorable is only hidden (not closed). By default when user click the X button it only hides the content.</remarks> 
public void Close() 
{ 
    var root = Root; 
    var parentAsContainer = Parent as ILayoutContainer; 
    parentAsContainer.RemoveChild(this); 
    if (root != null) 
     root.CollectGarbage(); 
    OnClosed(); 
} 

Weiß jemand, wie ich Dokument in AvalonDock gelänge, die von meinem Model.Documents, um entfernt werden können, um schließlich entsorgt werden, wenn ich seinen Hit Close Taste?

Zum Vergleich: Das ist mein XAML des AvalonDock:

<avalonDock:DockingManager 
    x:Name="DockingManager" 
    DocumentsSource="{Binding DocumentItems}" 
    ActiveContent="{Binding ActiveMainWindowViewModel, 
     Converter={StaticResource RestrictedClassConverter}, 
     ConverterParameter={x:Type multiSimAnalysis:MainWindowViewModel}, 
     Mode=TwoWay}" 
    DocumentClosing="DockingManager_DocumentClosing" 
    ActiveContentChanged="DockingManager_ActiveContentChanged"> 

    <avalonDock:DockingManager.LayoutItemContainerStyleSelector> 
    <pane:PanesStyleSelector> 
     <pane:PanesStyleSelector.MainWindowViewLcStyle> 
     <Style TargetType="{x:Type avalonDock:LayoutItem}"> 
      <Setter Property="Title" Value="{Binding Model.Title}"/> 
      <Setter Property="ToolTip" Value="{Binding Model.Title}"/> 
      <Setter Property="CloseCommand" Value="{Binding Model.CloseCommand}"/> 
      <Setter Property="IconSource" Value="{Binding Model.IconSource}"/> 
      <Setter Property="IsSelected" Value="{Binding Model.IsSelected, Mode=TwoWay}"/> 
      <Setter Property="IsActive" Value="{Binding Model.IsActive, Mode=TwoWay}"/> 
      <Setter Property="ContentId" Value="{Binding Model.ContentId}"/> 
     </Style> 
     </pane:PanesStyleSelector.MainWindowViewLcStyle> 
    </pane:PanesStyleSelector> 
    </avalonDock:DockingManager.LayoutItemContainerStyleSelector> 

    <avalonDock:DockingManager.LayoutItemTemplateSelector> 
    <multiSimAnalysis:PanesTemplateSelector> 
     <multiSimAnalysis:PanesTemplateSelector.MainWindowLcTemplate> 
     <DataTemplate> 
      <multiSimAnalysis:MainWindowViewLc /> 
     </DataTemplate> 
     </multiSimAnalysis:PanesTemplateSelector.MainWindowLcTemplate> 
    </multiSimAnalysis:PanesTemplateSelector> 
    </avalonDock:DockingManager.LayoutItemTemplateSelector> 

    <avalonDock:DockingManager.Theme> 
    <avalonDock:VS2010Theme/> 
    </avalonDock:DockingManager.Theme> 
    <avalonDock:LayoutRoot> 
    <avalonDock:LayoutPanel Orientation="Horizontal"> 
     <avalonDock:LayoutAnchorablePane DockWidth="400"> 
     <avalonDock:LayoutAnchorable Title="Scope(s) selection" x:Name="PanelScopeSelection" IsVisible="True"> 
      <scopeSelection:UserControlSelectStudyScope x:Name="ToolScopeSelection"/> 
     </avalonDock:LayoutAnchorable> 
     </avalonDock:LayoutAnchorablePane> 
     <avalonDock:LayoutDocumentPane/> 
     <avalonDock:LayoutAnchorablePane DockWidth="150"> 
     <avalonDock:LayoutAnchorable Title="Properties" x:Name="PanelScopePropertyGrid"> 
      <!--<multiSimAnalysis:UserControlPropertyGrid x:Name="ToolPropertyGrid" />--> 
      <xctk:PropertyGrid x:Name="ToolPropertyGrid" SelectedObject="{Binding ActiveObject}" /> 
     </avalonDock:LayoutAnchorable> 
     </avalonDock:LayoutAnchorablePane> 
    </avalonDock:LayoutPanel> 
    </avalonDock:LayoutRoot> 
</avalonDock:DockingManager> 

Antwort

2

ich tatsächlich eine nicht akzeptable Problemumgehung finden. Es ist wirklich verdreht.

Ich gebe das nur als Referenz. Es sollte einen sauberen Weg geben, es zu tun.

// ************************************************************************ 
    private void DockingManager_DocumentClosing(object sender, Xceed.Wpf.AvalonDock.DocumentClosingEventArgs e) 
    { 
     e.Document.CanClose = false; 

     DocumentModel documentModel = e.Document.Content as DocumentModel; 
     if (documentModel != null) 
     { 
      Dispatcher.BeginInvoke(new Action(() => this.Model.DocumentItems.Remove(documentModel)), DispatcherPriority.Background); 
     } 
    } 
+0

Gibt es eine Möglichkeit, dies zu beheben, wenn Sie MVVM nicht verwenden? –

+0

Ich weiß es nicht ??? (Entschuldigung für die Verspätung ... Ich habe gerade deine Frage gesehen) –

+0

Das ist ein langer Schuss, aber dieses Ereignis wird nie für mich genannt, hat sonst jemand eine ähnliche Erfahrung? –

-1

Registrierung für IsVisibleChanged.

void layoutFPR_Hidden(object sender, EventArgs e) 
{ 
    LayoutAnchorable window = (LayoutAnchorable)sender; 
    YourClass content = window.Content as YourClass; 

    // Close the object 
    content = null; 
    ((LayoutAnchorable)sender).Close(); 

} 
0

ich gefunden habe, dass auf ein LayoutDocument oder ein LayoutAnchorablePane, sowohl diese Einstellung Anwendung funktioniert: CanClose="False" oder CanFloat="False".

Es entfernt die Schließen-Schaltfläche.

<avalonDock:LayoutDocument Title="Board" 
          ContentId="Board" 
          CanClose="False" 
          CanFloat="False"> 
</avalonDock:LayoutDocument>