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

问题描述 投票:0回答:1

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

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

自定义控件是一个用户控件,像这样

public partial class MyStatusBar : UserControl, INotifyPropertyChanged

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

c# wpf data-binding custom-controls stackpanel
1个回答
1
投票

MyStatusBar 不应该是一个 UserControl 但POCO。

public class MyStatusBar : INotifyPropertyChanged { ... }

你可以使用 ItemsControl 绑定到 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 指定面板--在本例中是一个 StackPanel - 该 ItemsPresenter 中的项目的布局而创建的。ItemsControl.

注意到 MyStatusBarMyStatusBarUserControl 是不同的类型。视图模型不应该创建或暴露UI元素。它应该暴露数据对象。然后,您可以通过使用 ItemTemplate.


0
投票

请查看代码片段.将Itemcontrol替换为任何itemscontrols',如listbox等,否则,你仍然可以使用Itemscontrol。

<ItemsControl ItemsSource="{Binding MyUIObjects}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>
© www.soinside.com 2019 - 2024. All rights reserved.