将StackPanel绑定到添加子元素的方法

时间:2015-02-05 20:20:47

标签: c# wpf xaml data-binding windows-applications

这是我的问题:我有一个包装类,其中包含每组包含15个图像的列表集。我想将一个核心StackPanel绑定到一个方法,该方法实际上 修改 传递给它的同一StackPanel并添加子StackPanel每个包含15个图像的元素。

澄清:

  • 我有一个垂直方向的中心StackPanel StackPanel位于DataTemplate 内。

    <DataTemplate>
         <Grid x:Name="ImageDisplayGrid" Height="861" Width="656">
              <StackPanel x:Name="CentralImagePanel" HorizontalAlignment="Left" Height="841" Margin="10,10,0,0" VerticalAlignment="Top" Width="636"/>
         </Grid>
    </DataTemplate>
    
  • 我的包装类的很多实例每个最多包含15个图像(作为WritableBitmap个对象。
  • 我想将我的中心StackPanel绑定到一些修改StackPanel的方法,迭代我的包装类列表并将子StackPanel控件添加到中心StackPanel找到我的包装类的每个实例。
  • 对于(ImageSet1,ImageSet2等)包装类的每个实例,将添加到中心StackPanel的新StackPanel将使用该包装类中包含的图像进行填充实例
  • 在我看来,这里没有任何“返回”的东西,所以我希望有一种方法可以将控件(中心StackPanel)传递给某个方法,让方法修改它,然后在中心StackPanel填充其子项“StackPanels”后继续。

进一步澄清:

想想NetFlix。您知道如何在每个类别中垂直滚动,每个类别允许您水平滚动吗?这就是我想要模仿的东西,只是我希望它是动态的并绑定到包含要使用的图像列表的包装类。

我现在的主要障碍是中央StackPanel位于DataTemplate内,因此在运行时无法轻松访问它。最重要的是,无论如何使用绑定会更好。

我尝试使用IValueConverter将我的包装器类转换为中心StackPanel可以使用的StackPanel个对象列表,但这不起作用。我还搜索了将控件绑定到没有返回属性而没有任何运气的方法的方法。

非常感谢任何帮助或示例。

1 个答案:

答案 0 :(得分:1)

你在考虑这个错误。真的,真的,错的。 StackPanel布局控件。您不应该永远直接修改其子项或任何其他属性。

正如您所注意到的,没有真正的方法以您描述的方式完成此任务。

要显示集合,请使用ItemsControl。在你的情况下,它会是这样的:

<ItemsControl ItemsSource="{Binding Categories}">
    <ItemsControl.ItemsPanel>
       <ItemsPanelTemplate>
          <StackPanel />
       </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <ItemsControl ItemsSource={"Binding Videos"}>
               <ItemsControl.ItemsPanel>
                   <ItemsPanelTemplate>
                      <StackPanel Orientation="Horizontal"/>
                   </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
               <ItemsControl.ItemTemplate>
                   <DataTemplate>
                      <!-- Whatever -->
                   </DataTemplate>
               </ItemsControl.ItemTemplate>
            </ItemsControl>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

请注意,内部模板是另一个 ItemsControl,这次使用水平StackPanel作为面板模板。