WPF—将方向属性绑定到ItemsPanelTemplate'中的DockPanel.Dock;堆垛板

WPF—将方向属性绑定到ItemsPanelTemplate'中的DockPanel.Dock;堆垛板,wpf,binding,wpf-controls,Wpf,Binding,Wpf Controls,我正在构建一个CustomControl,它继承ItemsControl并为ItemsPanelTemplate创建一个StackPanel。 这就是风格: <Style TargetType="{x:Type MyCustomControl}"> <Setter Property="ItemsPanel"> <Setter.Value> <ItemsPanelTemplate>

我正在构建一个CustomControl,它继承ItemsControl并为ItemsPanelTemplate创建一个StackPanel。 这就是风格:

   <Style TargetType="{x:Type MyCustomControl}">
      <Setter Property="ItemsPanel">
         <Setter.Value>
            <ItemsPanelTemplate>
               <StackPanel Orientation="{Binding Path=DockPanel.Dock, Converter={StaticResource PositionToOrientationConverter}}"/>
            </ItemsPanelTemplate>
         </Setter.Value>
      </Setter>
      <Setter Property="Template">
         <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:MyCustomControl}">
               <Grid >
                  <Border Background="Black" Height="0"/>
                  <ItemsPresenter/>
               </Grid>
            </ControlTemplate>
         </Setter.Value>
      </Setter>
   </Style>
但它似乎忽略了方向属性

<ItemsControl DockPanel.Dock="Top">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel>
                <StackPanel.Style>
                    <Style TargetType="StackPanel">
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding Path=(DockPanel.Dock), RelativeSource={RelativeSource AncestorType=ItemsControl}}"
                                         Value="Top">
                                <Setter Property="Orientation" Value="Horizontal"/>
                            </DataTrigger>
                            <DataTrigger Binding="{Binding Path=(DockPanel.Dock), RelativeSource={RelativeSource AncestorType=ItemsControl}}"
                                         Value="Bottom">
                                <Setter Property="Orientation" Value="Horizontal"/>
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </StackPanel.Style>
            </StackPanel>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>

编辑:我想获得的功能是,当我将MyCustomControl放入DockPanel中时,StackPanel将根据停靠来定向(就像我在转换器中编码的那样)。

您不需要任何转换器来实现所需的结果。只需为
Top
Bottom
值的
DockPanel.Dock
附加属性添加一个带有两个数据触发器的StackPanel样式

DataTriggers中的绑定使用ItemsControl作为它们的
相对资源
,并将属性路径放在括号中,因为它是一个附加属性

<ItemsControl DockPanel.Dock="Top">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel>
                <StackPanel.Style>
                    <Style TargetType="StackPanel">
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding Path=(DockPanel.Dock), RelativeSource={RelativeSource AncestorType=ItemsControl}}"
                                         Value="Top">
                                <Setter Property="Orientation" Value="Horizontal"/>
                            </DataTrigger>
                            <DataTrigger Binding="{Binding Path=(DockPanel.Dock), RelativeSource={RelativeSource AncestorType=ItemsControl}}"
                                         Value="Bottom">
                                <Setter Property="Orientation" Value="Horizontal"/>
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </StackPanel.Style>
            </StackPanel>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>


您当前正在绑定到数据项类的
DockPanel.Dock
属性。这是你的意图吗?除此之外,“我不能让它工作”不是一个非常有用的错误描述。请尝试为您的问题添加更多细节。谢谢您的评论。对不起,这是我的第一个问题。我编辑了该问题以明确我的意图。调试输出中是否有任何错误/绑定消息?没有错误或消息。我创建了一个程序,将我的CustomControl放在DockPanel中。但是如果我为MyCustomControl设置DockPanel.Dock=Top,则其中的项目将垂直排列,而不是水平排列。这正是我想要获得的。试图做到这一点,我专注于捆绑,不考虑触发。非常感谢你!!请注意,您当然也可以直接将StackPanel的方向与转换器绑定,但还需要添加RelativeSource并将路径放在括号中。