Dennis
Dennis

Reputation: 37770

Prevent document from closing in DockingManager

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.

Upvotes: 1

Views: 1489

Answers (1)

If you have a ContentViewModel - you can have an ICommand Close {get;set;} property and bind it to the LayoutItem's close command.

You can use a DelegateCommand for this on your ContentViewModel which can be used to determine if you can close the document or not (setting e.Cancel = true should stop the close command).

Upvotes: 1

Related Questions