WPF—将方向属性绑定到ItemsPanelTemplate'中的DockPanel.Dock;堆垛板
我正在构建一个CustomControl,它继承ItemsControl并为ItemsPanelTemplate创建一个StackPanel。 这就是风格: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>
<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并将路径放在括号中。