我正在尝试将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>
答案 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)
这是因为Button
被ItemsControl
中的ContentPresenter
包裹,而DockPanel.Dock
没有设置ItemContainerStyle
。尝试将<ItemsControl.ItemContainerStyle>
<Style TargetType="{x:Type ContentPresenter}">
<Setter Property="DockPanel.Dock" Value="{Binding}"/>
</Style>
</ItemsControl.ItemContainerStyle>
设置为以下内容:
{{1}}