Как связать свойство Style для LayoutAnchorableItem в файле XAML с помощью AvalonDock? - PullRequest
0 голосов
/ 24 января 2019

Я создал интерфейс стыковки avalon в своем проекте, например, я хочу взаимодействовать со свойством LayoutAnchorableItem «Visibility», но как внедрить его в мой XAML-код?У меня не может быть двух определений стиля в моей ветви DockingManager.LayoutItemContainerStyle ...

Строка, которую я хочу добавить:

<Setter Property="Visibility" Value="{Binding Model.IsVisible, ConverterParameter={x:Static Visibility.Hidden}, Converter={StaticResource btvc}, Mode=TwoWay}" />

Мой исходный код XAML:

<dock:DockingManager DataContext="{Binding DockManagerViewModel}" DocumentsSource="{Binding Documents}" AnchorablesSource="{Binding Anchorables}" >
    <dock:DockingManager.Resources>
    <!-- add views for specific ViewModels -->
        <DataTemplate DataType="{x:Type vmdock:SampleDockWindowViewModel}">
            <uscontrol:SampleDockWindowView />
        </DataTemplate>
    </dock:DockingManager.Resources>
    <dock:DockingManager.LayoutItemContainerStyle>
    <!--you can add additional bindings from the layoutitem to the DockWindowViewModel-->
        <Style TargetType="{x:Type dockctrl:LayoutItem}">
            <Setter Property="Title" Value="{Binding Model.Title}" />
            <Setter Property="CloseCommand" Value="{Binding Model.CloseCommand}" />
            <Setter Property="CanClose" Value="{Binding Model.CanClose}" />
            <Setter Property="IsSelected" Value="{Binding Model.IsSelected}" />
        </Style>
    </dock:DockingManager.LayoutItemContainerStyle>

Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Спасибо за ваш ответ!Я не уверен, что это решает мою проблему ... я хочу определить стиль для другого типа цели, например, если бы я мог написать:

<Style TargetType="{x:Type dockctrl:LayoutItem}">
[...]
</Style>

<Style TargetType="{x:Type dockctrl:LayoutAnchorableItem}">
  [...]
</Style>

Но я не мог написать оба стиля напрямуюв мою ветку DockingManager.LayoutItemContainerStyle.Он принимает только одно определение стиля ... как с этим бороться?Спасибо

0 голосов
/ 24 января 2019

Если вы хотите выбрать один из нескольких стилей, в док-менеджере используется свойство LayoutItemContainerStyleSelector , в котором используется Выбор стиля . С помощью этого селектора стилей вы можете выбрать, какой стиль применять в зависимости от того, является ли объект LayoutAnchorableItem или другим типом LayoutItem.

public class MyStyleSelector : StyleSelector
{

    public Style DefaultStyle { get; set; }
    public Style CustomStyle { get; set; }

    public override Style SelectStyle(object item, DependencyObject container)
    {
        if (item is LayoutAnchorableItem)
        {
            return CustomStyle;
        }
        return DefaultStyle;
    }

}

Если вы хотите объединить один установщик стиля с другим стилем, вы можете использовать свойство BasedOn . Это работает, потому что LayoutAnchorableItem наследует LayoutItem. При этом вы можете создать стиль, основанный на другом стиле, чтобы он наследовал все сеттеры. Ресурсы будут выглядеть так:

<Style TargetType="{x:Type dockctrl:LayoutItem}" x:Key="DefaultStyle">
  <Setter Property="Title" Value="{Binding Model.Title}" />
  <Setter Property="CloseCommand" Value="{Binding Model.CloseCommand}" />
  <Setter Property="CanClose" Value="{Binding Model.CanClose}" />
  <Setter Property="IsSelected" Value="{Binding Model.IsSelected}" />
</Style>

<Style TargetType="{x:Type dockctrl:LayoutAnchorableItem}" BasedOn="{StaticResource DefaultStyle}" x:Key="CustomStyle">
  <Setter Property="Visibility" Value="{Binding Model.IsVisible, ConverterParameter={x:Static Visibility.Hidden}, Converter={StaticResource btvc}, Mode=TwoWay}" />
</Style>

<local:MyStyleSelector DefaultStyle="{StaticResource DefaultStyle}" CustomStyle="{StaticResource CustomStyle}" x:Key="MyStyleSelector" />

Теперь вы можете заполнить диспетчер стыковки новым селектором стиля.

<dock:DockingManager LayoutItemContainerStyleSelector="{StaticResource MyStyleSelector}" ...

Вы можете опустить селектор стилей и удалить ключи из ресурсов. Обратите внимание, что эти стили будут применяться ко всем дочерним элементам, а это не то, чего вы обычно хотите.

...