2013-06-19 8 views
1

Вот пример, в котором используется расширенный набор инструментов WPF 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> 

Code-за:

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.

Вы можете использовать DelegateCommand для этого в ContentViewModel, который может использоваться для определения того, можно ли закрыть документ или нет (установка e.Cancel = true должна остановить команду закрытия).

Смежные вопросы