如何将自定义控件的 ObservableCollection 绑定到 StackPanel?

How to bind a ObservableCollection of custom controls to a StackPanel?

我有一个自定义控件对象的 ObservableCollection。

ObservableCollection<MyStatusBar> MyUIObjects = new ObservableCollection<MyStatusBar>();

自定义控件就是这样的用户控件

public partial class MyStatusBar : UserControl, INotifyPropertyChanged

将我的控件列表绑定到堆栈面板以便它们显示的最简单方法是什么。目前,当我绑定它们时,没有任何显示。当我手动将控件添加到 StackPanel.Children 集合时,它们会显示出来,但我想通过绑定来完成。

请查看代码片段。 将 Itemscontrol 替换为任何 itemscontrol',如列表框等等,否则你仍然可以使用 Itemscontrol

<ItemsControl ItemsSource="{Binding MyUIObjects}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>

MyStatusBar 不应该是 UserControl 而应该是 POCO:

public class MyStatusBar : INotifyPropertyChanged { ... }

然后您可以使用 ItemsControl 绑定到 ObservableCollection<MyStatusBar> 并在放置 UserControl 的位置定义一个 ItemTemplate 以便为每个 POCO 对象呈现:

<ItemsControl ItemsSource="{Binding MyUIObjects}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <local:MyStatusBarUserControl />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

ItemsPanelTemplate 指定面板 - 在本例中为 StackPanel - ItemsPresenterItemsControl 中的项目布局创建。

请注意,MyStatusBarMyStatusBarUserControl 是不同的类型。视图模型不应创建或公开 UI 元素。它应该公开数据对象。然后,您将使用 ItemTemplate.

每个数据对象创建一个 UI 元素