【问题标题】:Databind DockPanel数据绑定 DockPanel
【发布时间】:2013-07-07 12:55:21
【问题描述】:

我正在尝试将 wpf 中的 Dockpanel 数据绑定到视图模型集合。我正在使用它来创建一个可自定义的表单,因此在运行时之前我不会知道停靠面板中应该有多少孩子。

我遇到的问题是,当我从数据模板中设置附加属性 DockStyle.Dock 时,它似乎没有被应用。以下 xaml 是我正在做的事情的简化版本。我希望第一个按钮填满屏幕的顶部,但真正发生的是它们水平堆叠。即使硬编码 DockPanel.Dock 属性也不会影响按钮的布局。当我查看 XAMLPad 中的 Visual Tree 时,我注意到有 ContentPresenters 作为 DockPanel 的子项,而不是按钮。 ContentPresenters 的布局是否与其他元素不同?是否有另一种技术可以将数据绑定到 DockPanel?

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:sys="clr-namespace:System;assembly=mscorlib" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >

<Grid>
<ItemsControl >
         <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <DockPanel LastChildFill="True"/>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
       <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Button DockPanel.Dock="{Binding}" Content="{Binding}"></Button>
            </DataTemplate>
       </ItemsControl.ItemTemplate>
       <sys:String>Top</sys:String>
          <sys:String>Bottom</sys:String>
       <sys:String>Left</sys:String>
       <sys:String>Right</sys:String>
<sys:String>Top</sys:String>
<sys:String>Top</sys:String>
<sys:String>Top</sys:String>
    </ItemsControl>
</Grid></Page>

【问题讨论】:

    标签: c# wpf xaml


    【解决方案1】:

    项目未停靠的原因是DataTemplate 中的控件不是DockPanel 的直接子级。我相信ItemsControl 会为每个项目创建一个ContentPresenter,就像ListBox 如何为每个项目创建一个ListBoxItem

    您可以尝试使用ItemContainerStyle 来停靠控件。我认为在它上面设置的任何属性都应该在ContentPresenter 上设置。这样的事情可能会奏效:

    <ItemsControl>
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <DockPanel />
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Button Content="{Binding}" />
            </DataTemplate>
        </ItemsControl.ItemTemplate>
        <ItemsControl.ItemContainerStyle>
            <Style>
                <Setter Property="DockPanel.Dock" Value="{Binding}" />
            </Style>
        </ItemsControl.ItemContainerStyle>
        ...
    </ItemsControl>
    

    不过,我不确定将字符串绑定到Dock 属性是否有效。您可以尝试直接使用枚举中的值来查看是否也有帮助。

    【讨论】:

    • 就是这样!非常感谢帮忙。我整个上午都在为此苦苦挣扎。
    【解决方案2】:

    这是因为您的ButtonItemsControl 包裹在ContentPresenter 中,而ContentPresenter 没有设置DockPanel.Dock。尝试将ItemContainerStyle 设置为这样的:

    <ItemsControl.ItemContainerStyle>
        <Style TargetType="{x:Type ContentPresenter}">
            <Setter Property="DockPanel.Dock" Value="{Binding}"/>
        </Style>
    </ItemsControl.ItemContainerStyle>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-22
      • 2011-01-11
      • 2018-03-27
      • 2021-12-30
      • 2011-08-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多