防止文档在DockingManager中关闭

时间:2013-06-19 07:53:21

标签: c# wpf avalondock xceed

这是一个示例,它使用Extended WPF Toolkit中的DockingManager(a.k.a AvalonDock)。

查看型号:

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方式,我喜欢数据绑定。

1 个答案:

答案 0 :(得分:1)

如果您有ContentViewModel - 您可以拥有ICommand Close {get; set;}属性并将其绑定到LayoutItem的close命令。

您可以在ContentViewModel上使用DelegateCommand,可用于确定是否可以关闭文档(设置e.Cancel = true应该停止关闭命令)。