嵌套数据绑定与C#WPF中ItemsControl的对齐

时间:2013-08-21 12:09:44

标签: c# wpf xaml mvvm itemscontrol

我有以下datatemplate:

<ItemsControl x:Name="Groups" ItemsSource="{Binding Groups}">
    <ItemsControl.ItemTemplate>
         <DataTemplate>
               <StackPanel x:Name="GroupStackPanel" Orientation="Horizontal">
                    <GroupBox Header="{Binding Path=GroupName}">
                         <ItemsControl ItemsSource="{Binding Buttons}">
                               <ItemsControl.ItemTemplate>
                                    <DataTemplate>
                                         <StackPanel x:Name="BtnStackPanel" Orientation="Horizontal">
                                               <Button Content="{Binding Path=LabelString}"
                                                                Command="{Binding Path=ButtonCommand}"/>
                                          </StackPanel>
                                     </DataTemplate>
                                </ItemsControl.ItemTemplate>
                           </ItemsControl>
                      </GroupBox>
                 </StackPanel>
           </DataTemplate>
     </ItemsControl.ItemTemplate>
</ItemsControl>

这包括此组中的一些ButtonGroups和Buttons。

类组包含字符串属性&#34; GroupName&#34;和一个ObservableCollection-property&#34; Buttons&#34;。按钮和组的分配工作正常。

所以这是我的问题:我想在 dockpanel 中的 ribbontab 中添加这些buttongroup。但是对齐或方向是错误的,因此按钮是一个在另一个之下而不是彼此相邻。 有谁知道我的代码有什么问题?

1 个答案:

答案 0 :(得分:2)

目前,您正在使用水平方向的Stackpanel,这是正确的想法,但Stackpanel位于错误的位置(ItemTemplate)。 ItemTemplate适用于ItemsControl中的每个项目,这意味着您的XAML代表一组按钮,其中每个按钮都由其自己的StackPanel包围。

要获得所需效果,您需要将Stackpanel指定为ItemsPanelTemplate的{​​{1}}。

尝试将内部条款更改为:

ItemsControl

修改

如果您希望水平显示组和按钮,则可以对两者执行相同的操作:

<ItemsControl ItemsSource="{Binding Buttons}">
   <ItemsControl.ItemTemplate>
     <DataTemplate>
       <Button Content="{Binding Path=LabelString}" Command="{Binding Path=ButtonCommand}"/>
     </DataTemplate>
   <ItemsControl.ItemsPanel>
     <ItemsPanelTemplate>
       <StackPanel x:Name="BtnStackPanel" Orientation="Horizontal">
     </ItemsPanelTemplate>  
   <ItemsControl.ItemsPanel>
</ItemsControl>