我正在尝试将wpf中的Dockpanel数据绑定到视图模型集合。我使用它是为了创建一个可定制的窗体,所以在运行之前我不知道dockpanel中应该有多少子对象。
我遇到的问题是,当我从数据模板中设置附加属性DockStyle.Dock时,它似乎没有被应用。下面的xaml是我正在做的事情的简化版本。我本以为第一个按钮会填满屏幕的顶部,但实际上它们是水平堆叠在一起的。即使对DockPanel.Dock属性进行硬编码,也不会对按钮的布局产生影响。当我在XAMLPad中查看可视化树时,我注意到有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>

发布于 2013-07-10 03:33:02
之所以不停靠这些项,是因为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属性。您可以尝试直接使用枚举中的值,看看这是否也有帮助。
发布于 2013-07-10 03:32:35
这是因为您的Button是由没有设置DockPanel.Dock的ContentPresenter中的ItemsControl包装的。尝试将ItemContainerStyle设置为如下所示:
<ItemsControl.ItemContainerStyle>
<Style TargetType="{x:Type ContentPresenter}">
<Setter Property="DockPanel.Dock" Value="{Binding}"/>
</Style>
</ItemsControl.ItemContainerStyle>https://stackoverflow.com/questions/17556336
复制相似问题