【问题标题】:WPF - Bind Orientation property to DockPanel.Dock in ItemsPanelTemplate's StackPanelWPF - 将方向属性绑定到 ItemsPanelTemplate 的 StackPanel 中的 DockPanel.Dock
【发布时间】:2016-10-09 21:33:00
【问题描述】:

我正在构建一个继承 ItemsControl 并具有 ItemsPanelTemplate 的 StackPanel 的 CustomControl。 这是风格:

   <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>

这是转换器类:

   Public Class PositionToOrientation
  Implements IValueConverter

  Public Function Convert(value As Object, targetType As Type, parameter As Object, culture As Globalization.CultureInfo) As Object Implements IValueConverter.Convert
     Dim position As Dock = value
     Select Case position
        Case Dock.Top
           Return Orientation.Horizontal
        Case Dock.Bottom
           Return Orientation.Horizontal
        Case Dock.Left
           Return Orientation.Vertical
        Case Dock.Right
           Return Orientation.Vertical
     End Select
     Return Dock.Top
  End Function

  Public Function ConvertBack(value As Object, targetType As Type, parameter As Object, culture As Globalization.CultureInfo) As Object Implements IValueConverter.ConvertBack
     Throw New NotImplementedException
  End Function
   End Class

但它似乎忽略了方向属性。

编辑:我想要获得的功能是,当我将 MyCustomControl 放入 DockPanel 时,StackPanel 会根据对接进行定向(就像我在 Converter 中编码一样)。

【问题讨论】:

  • 您当前正在绑定到数据项类的DockPanel.Dock 属性。这是你的意图吗?除此之外,“我无法正常工作”并不是一个很有帮助的错误描述。尝试为您的问题添加更多详细信息。
  • 感谢您的评论。抱歉,这是我的第一个问题。我编辑了问题以明确我的意图。
  • 调试输出中是否有任何错误/绑定消息?
  • 没有错误或消息。我创建了一个程序,将 MyCustomControl 放在 DockPanel 中。但是,如果我为 MyCustomControl 设置 DockPanel.Dock=Top,其中的项目将垂直排列而不是水平排列。

标签: wpf binding wpf-controls


【解决方案1】:

您不需要任何转换器即可达到预期的效果。只需为TopBottom 值的DockPanel.Dock 附加属性添加一个带有两个DataTrigger 的StackPanel 样式。

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

<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>

【讨论】:

  • 这正是我想要获得的。试图做到这一点,我专注于绑定,不考虑触发器。非常感谢!!
  • 请注意,您当然也可以直接将 StackPanel 的方向与转换器绑定,但您还需要添加 RelativeSource 并将路径放在括号中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-17
  • 2010-11-12
  • 1970-01-01
  • 2011-12-31
  • 1970-01-01
相关资源
最近更新 更多