Databind DockPanel

时间:2013-07-09 19:13:44

标签: c# wpf xaml

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

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

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

Here is a picture of the rendered control in xamlpad

2 个答案:

答案 0 :(得分:8)

项目未停靠的原因是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属性是否有效。您可以尝试直接使用枚举中的值来查看是否也有帮助。

答案 1 :(得分:1)

这是因为ButtonItemsControl中的ContentPresenter包裹,而DockPanel.Dock没有设置ItemContainerStyle。尝试将<ItemsControl.ItemContainerStyle> <Style TargetType="{x:Type ContentPresenter}"> <Setter Property="DockPanel.Dock" Value="{Binding}"/> </Style> </ItemsControl.ItemContainerStyle> 设置为以下内容:

{{1}}