这是一个示例,它使用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方式,我喜欢数据绑定。
答案 0 :(得分:1)
如果您有ContentViewModel - 您可以拥有ICommand Close {get; set;}属性并将其绑定到LayoutItem的close命令。
您可以在ContentViewModel上使用DelegateCommand,可用于确定是否可以关闭文档(设置e.Cancel = true应该停止关闭命令)。