对此感到抱歉,但我认为您可能会以错误的方式解决此问题。
在 WPF 中,面板只是用来定义事物的布局方式。
由于您尝试使用面板,因此我假设您的模型中有一系列东西。我们可以使用 a 来处理集合ListBox
,我们可以为其提供正确的面板类型。IE
<ListBox ItemsSource="{Binding MyThings}">
<ListBox.ItemsPanel>
<StackPanel Orientation="Vertical"/>
</ListBox.ItemsPanel>
</ListBox>
然而,这通常只是给我们一个类名列表,每个类名代表你的一个事物,你需要告诉 WPF 如何显示它,为此你使用一个DataTemplate
. 您可以在许多地方、资源部分(用于控件、窗口或应用程序)或您需要的地方定义它们。
<ListBox ItemsSource="{Binding MyThings}">
<ListBox.ItemsPanel>
<StackPanel Orientation="Vertical"/>
</ListBox.ItemsPanel>
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}"/> <!-- Assuming each thing has a name property-->
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
更新:或者如果您有不同类型的项目要显示
<ListBox ItemsSource="{Binding MyThings}">
<ListBox.ItemsPanel>
<Canvas/>
</ListBox.ItemsPanel>
<ListBox.Resources>
<DataTemplate TargetType="{x:Type MyLine}">
<Line x1="{Binding Left}" x2="{Binding Right}"
y1="{Binding Top}" y2="{Binding Bottom}"/>
</DataTemplate>
<DataTemplate TargetType="{x:Type MyRectangle}">
<Border Canvas.Left="{Binding Left}" Canvas.Right="{Binding Right}"
Canvas.Top="{Binding Top}" Canvas.Bottom="{Binding Bottom}"/>
</DataTemplate>
</ListBox.Resources>
</ListBox>
还可以阅读Josh Smith 关于 MVVM 的文章,其中有很多示例和良好实践,并且会介绍一种让您的模型保持清洁的模式。