c# - 如何将自定义控件的 ObservableCollection 绑定到 StackPanel?
问题描述
我有一个自定义控件对象的 ObservableCollection。
ObservableCollection<MyStatusBar> MyUIObjects = new ObservableCollection<MyStatusBar>();
自定义控件是这样的用户控件
public partial class MyStatusBar : UserControl, INotifyPropertyChanged
我可以将控件列表绑定到堆栈面板以便它们显示的最简单方法是什么。目前,当我绑定它们时,什么都没有出现。当我手动将控件添加到 StackPanel.Children 集合时,它们会显示出来,但我想通过绑定来完成。
解决方案
MyStatusBar
不应该是UserControl
POCO 而是 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
-ItemsPresenter
为ItemsControl
.
请注意MyStatusBar
和MyStatusBarUserControl
是不同的类型。视图模型不应创建或公开 UI 元素。它应该公开数据对象。然后,您将使用ItemTemplate
.
推荐阅读
- mysql - 基于登录用户的MySQL变量数据库表
- vue.js - AWS Amplify + Vuejs - 联合登录
- mysql - 如何在 SQL 中创建日期占位符?
- lmdb - 在 LMDB 中,事务是读取它刚刚写入的值还是旧值?
- c++ - C ++“使用”关键字用于唯一类型而不是别名
- c++ - 可变参数模板错误:“在实例化中”(gcc 9.2)
- c++ - 是否可以避免每次都链接 gsl 和 openmp?
- python - TKinter Matplotlib 图不显示
- tensorflow - ANN - 低性能
- reactjs - 第一次提交表单后如何将formik中的validateOnChange和validateOnBlur更改为true?