2013-06-19 128 views
1

下面是使用Extended WPF Toolkit的DockingManager(又名AvalonDock)的示例。防止文檔在DockingManager中關閉

視圖模型:

public class Person 
{ 
    public string Name { get; set; } 
    public bool CanClose { get; set; } 
} 

查看:

<Window x:Class="WpfApplication2.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:xcad="http://schemas.xceed.com/wpf/xaml/avalondock" 
     xmlns:local="clr-namespace:WpfApplication2"> 
    <Grid> 
     <xcad:DockingManager DocumentsSource="{Binding}"> 
      <xcad:DockingManager.Resources> 
       <DataTemplate DataType="{x:Type local:Person}"> 
        <StackPanel> 
         <TextBlock Text="Here's person name:"/> 
         <TextBlock Text="{Binding Name}"/> 
        </StackPanel> 
       </DataTemplate> 
      </xcad:DockingManager.Resources> 

      <xcad:DockingManager.DocumentHeaderTemplate> 
       <DataTemplate> 
        <TextBlock Text="{Binding Content.Name}" /> 
       </DataTemplate> 
      </xcad:DockingManager.DocumentHeaderTemplate> 

      <xcad:LayoutRoot> 
       <xcad:LayoutPanel Orientation="Horizontal"> 
        <xcad:LayoutDocumentPane /> 
       </xcad:LayoutPanel> 
      </xcad:LayoutRoot> 
     </xcad:DockingManager> 
    </Grid> 
</Window> 

代碼隱藏:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 

     DataContext = new[] 
     { 
      new Person { Name = "John" }, 
      new Person { Name = "Mary", CanClose = true }, 
      new Person { Name = "Peter", CanClose = true }, 
      new Person { Name = "Sarah", CanClose = true }, 
     }; 
    } 
} 

我想阻止文檔經由CanClose財產在我的視圖模型關閉。 我所料,那一定是有風格的文檔容器,所以,我會寫這樣的:

<Setter Property="CanClose" Value="{Binding Content.CanClose}"/> 

,一切都將正常工作。但看起來像DockingManager沒有這樣的風格。

我錯過了什麼嗎?

更新

當然,我可以編寫一個附加行爲,它將聽取DockingManager.DocumentClosing事件並將其分派到任何視圖模型,該視圖模型將綁定到DockingManager。但在我看來很愚蠢......

另一種方式是在視圖來處理事件:

private void DockingManager_DocumentClosing(object sender, Xceed.Wpf.AvalonDock.DocumentClosingEventArgs e) 
{ 
    e.Cancel = !((Person)e.Document.Content).CanClose; 
} 

但它絕對不是一個MVVM路,我喜歡數據綁定。

+0

*聳聳肩*對不起。 –

回答

1

如果您有ContentViewModel - 您可以擁有ICommand Close {get; set;}屬性並將其綁定到LayoutItem的close命令。

您可以在您的ContentViewModel上使用DelegateCommand來確定是否可以關閉文檔(設置e.Cancel = true應該停止關閉命令)。