首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数据绑定DockPanel

数据绑定DockPanel
EN

Stack Overflow用户
提问于 2013-07-10 03:13:44
回答 2查看 3.2K关注 0票数 2

我正在尝试将wpf中的Dockpanel数据绑定到视图模型集合。我使用它是为了创建一个可定制的窗体,所以在运行之前我不知道dockpanel中应该有多少子对象。

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

代码语言:javascript
复制
<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>

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-10 03:33:02

之所以不停靠这些项,是因为DataTemplate中的控件不是DockPanel的直接子控件。我相信ItemsControl会为每个项目创建一个ContentPresenter,就像ListBox为每个项目创建一个ListBoxItem一样。

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

代码语言:javascript
复制
<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属性。您可以尝试直接使用枚举中的值,看看这是否也有帮助。

票数 8
EN

Stack Overflow用户

发布于 2013-07-10 03:32:35

这是因为您的Button是由没有设置DockPanel.DockContentPresenter中的ItemsControl包装的。尝试将ItemContainerStyle设置为如下所示:

代码语言:javascript
复制
<ItemsControl.ItemContainerStyle>
    <Style TargetType="{x:Type ContentPresenter}">
        <Setter Property="DockPanel.Dock" Value="{Binding}"/>
    </Style>
</ItemsControl.ItemContainerStyle>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17556336

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档