2013-06-19 2 views
1

다음은 확장 WPF Toolkit의 DockingManager (a.k.a 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> 

코드 숨김 : 내보기 모델에 CanClose 속성을 통해 폐쇄에서 문서를 방지 할

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 }, 
     }; 
    } 
} 

.

<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

* shrugs * 죄송합니다. –

답변

1

ContentViewModel이있는 경우 ICommand Close {get; set;} 속성을 사용하여 LayoutItem의 닫기 명령에 바인딩 할 수 있습니다.

ContentViewModel에서 DelegateCommand를 사용하면 문서를 닫을 수 있는지 여부를 결정할 수 있습니다 (e.Cancel = true로 설정하면 닫기 명령이 중단되어야 함).

관련 문제