2013-08-21 16 views
5

Uso AvalonDock con MVVM in un progetto WPF.WPF - AvalonDock - Documento di chiusura

Quando si preme la "X" (pulsante Chiudi della scheda) il mio documento si chiude ma resta in memoria. Sembra che sia solo nascosto. Non viene rimosso dalla mia collezione Model.Documents.

Se aggiungo DockingManager_DocumentClosing e provo a rimuovere il mio documento dalla raccolta, ricevo un'eccezione nel seguente metodo di Xceed.Wpf.AvalonDock.Layout.LayoutContent perché parentAsContainer è null.

/// <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(); 
} 

Qualcuno sa come potrei gestire documenti in AvalonDock che può essere rimosso dal mio Model.Documents al fine di essere finalmente essere smaltiti quando ho colpito il suo pulsante Close?

Per riferimento: Questo è il mio XAML del 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> 

risposta

2

ho effettivamente trovare una soluzione inaccettabile. È davvero contorto.

L'ho dato solo come riferimento. Ci dovrebbe essere un modo pulito per farlo.

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

C'è un modo per risolvere questo problema se non si utilizza MVVM? –

+0

Non lo so ??? (scusa per il ritardo ... ho appena visto la tua domanda) –

+0

Questo è un campo lungo, ma questo evento non è mai stato chiamato per me, qualcun altro ha un'esperienza simile? –

-1

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

Ho scoperto che su un LayoutDocument o un LayoutAnchorablePane, applicando sia questa impostazione funziona: CanClose="False" o CanFloat="False".

Rimuove il pulsante Chiudi.

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