Вот пример, в котором используется расширенный набор инструментов WPF DockingManager
(a.k.a AvalonDock).Предотвращение закрытия документа в DockingManager
Вид модели:
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>
Code-за:
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-полосная, и я, как связывание данных.
* пожимает плечами * извините пожалуйста. –