2013-08-21 179 views
5

我在WPF项目中使用MVVM的AvalonDock。WPF - AvalonDock - 关闭文档

当我点击“X”(选项卡的关闭按钮)时,我的文档关闭但仍保留在内存中。它似乎只是隐藏起来的。它不会从我的Model.Documents集合中删除。

如果我添加DockingManager_DocumentClosing并尝试从集合中删除我的文档,我会收到以下方法Xceed.Wpf.AvalonDock.Layout.LayoutContent中的异常,因为parentAsContainer为空。

​​

有谁知道我怎么能管理AvalonDock文档,可以从我的Model.Documents为了除去被最终处置时,我打了Close按钮?

供参考:这是我的AvalonDock的XAML:

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

回答

2

其实我觉得不能接受的解决办法。 它真的扭曲了。

我只把它作为参考。应该有一个干净的方式来做到这一点。

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

如果您不使用MVVM,有没有办法解决这个问题? –

+0

我不知道? (抱歉,延迟...我刚刚看到你的问题) –

+0

这是一个远射,但这个事件是从来没有给我打过电话,其他人有没有类似的经历? –

-1

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

我发现,在LayoutDocumentLayoutAnchorablePane,同时应用该设置:CanClose="False"CanFloat="False"

它删除关闭按钮。

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