首页 > 解决方案 > 如何将自定义控件的 ObservableCollection 绑定到 StackPanel?

问题描述

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

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

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

public partial class MyStatusBar : UserControl, INotifyPropertyChanged

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

标签: c#wpfdata-bindingcustom-controlsstackpanel

解决方案


MyStatusBar不应该是UserControlPOCO 而是 POCO:

public class MyStatusBar : INotifyPropertyChanged { ... }

然后,您可以使用 anItemsControl绑定到ObservableCollection<MyStatusBar>并定义一个ItemTemplate您将UserControl要为每个 POCO 对象呈现的位置:

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

ItemsPanelTemplate指定面板 - 在本例中为 a StackPanel-ItemsPresenterItemsControl.

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


推荐阅读