【问题标题】:How to bind Style property for LayoutAnchorableItem in XAML file with AvalonDock?如何将 XAML 文件中 LayoutAnchorableItem 的 Style 属性与 AvalonDock 绑定?
【发布时间】:2019-01-25 03:54:19
【问题描述】:

我在我的项目中创建了一个 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>

非常感谢!

【问题讨论】:

    标签: c# wpf avalondock


    【解决方案1】:

    如果您想在多种样式之间进行选择,停靠管理器上有一个LayoutItemContainerStyleSelector 属性,它使用Style Selector。 使用此样式选择器,您可以根据对象是 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}" ...
    

    您可以省略样式选择器并删除资源中的键。请注意,这些样式随后将应用于所有孩子,这不是您通常想要的。

    【讨论】:

      【解决方案2】:

      感谢您的回答! 我不确定它是否能解决我的问题......我想要的是为其他目标类型定义一种样式,就像我可以写一样:

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

      但我无法将这两种样式都直接写入我的 DockingManager.LayoutItemContainerStyle 分支。它只接受一个 Style 定义......如何处理?谢谢

      【讨论】:

        猜你喜欢
        • 2014-06-30
        • 2013-05-17
        • 2023-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多