Here's a sample, which uses DockingManager
(a.k.a AvalonDock) from Extended WPF Toolkit.
View model:
public class Person { public string Name { get; set; } public bool CanClose { get; set; } }
View:
<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-behind:
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 }, }; } }
I want to prevent documents from closing via CanClose
property in my view model. I've expected, that there must be some style for documents container, so, I'll write something like:
<Setter Property="CanClose" Value="{Binding Content.CanClose}"/>
and everything will work. But looks like there's no such style in DockingManager
.
Am I missing something?
Update.
Of course, I can write an attached behavior, which will listen to DockingManager.DocumentClosing
event and dispatch it to any view model, which will be bound to DockingManager
. But it seems to me very stupid...
Another way is to handle event in the view:
private void DockingManager_DocumentClosing(object sender, Xceed.Wpf.AvalonDock.DocumentClosingEventArgs e) { e.Cancel = !((Person)e.Document.Content).CanClose; }
But it is definitely not a MVVM-way, and I like data binding.