1

这是一个示例,它使用Extended WPF Toolkit 中的DockingManager(又名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 方式,我喜欢数据绑定。

4

1 回答 1

1

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

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

于 2013-08-23T05:01:04.733 回答