【发布时间】:2018-04-14 15:22:27
【问题描述】:
我想实现一个 WPF 控件,该控件支持绑定到实现特定接口的数据项集合,也支持它们的模板,并根据接口中公开的属性排列这些项。这通常是一种可接受的做法吗?哪种策略更好用?
谢谢!
【问题讨论】:
标签: wpf wpf-controls
我想实现一个 WPF 控件,该控件支持绑定到实现特定接口的数据项集合,也支持它们的模板,并根据接口中公开的属性排列这些项。这通常是一种可接受的做法吗?哪种策略更好用?
谢谢!
【问题讨论】:
标签: wpf wpf-controls
您提供的信息太宽泛了,所以我会尽量只介绍基础知识。
是的,WPF 确实支持将控件绑定到集合。您可以绑定到任何实现IEnumerable 的集合。这意味着您可以绑定到 .NET 中可用的大多数集合类型,包括 List<T>。
如果您想要一个 active 绑定,即当您在基础集合中添加或删除项目时控件应该更新自身,您的集合必须实现更改通知。为此,您可以实现 INotifyPropertyChanged 或简单地使用 ObservableCollection<T>。
在前端,如果你想能够选择项目,你可以使用ListBox,如果你不想选择项目,可以使用ItemsControl。
您必须针对您的基础数据类型创建DataTemplates,并将它们分配给ItemsControl.ItemTemplate 或ListBox.ItemTemplate,以便您的项目在控件中进行适当的查看。
请注意,如果您想动态更新项目属性并希望 ItemsControl 或 ListBox 相应地更新其项目,则您的数据类型必须在其自身级别实现更改通知。为此,您可以实现 INotifyPropertyChanged 或从 ObservableObject 派生您的类(如果您使用 MVVM Light)。
要更改项目在ItemsControl 中的排列方式,您可以将ItemsControl.ItemsPanel 设置为WPF 中可用的面板之一,例如StackPanel、WrapPanel 或Canvas 等。
普遍接受的做法是将您的项目分成(至少)两层(或 Visual Studio 中的项目);处理业务逻辑以及数据和操作的抽象存储的底层 ViewModel。此 ViewModel 不知道,因此独立于 UI。在这里,您可以在类和集合上实现更改通知,并公开您希望 UI 控件绑定到的公共属性。然后在 ViewModel 层之上,创建一个了解 ViewModel 层的 View 层(在 View 项目中添加 ViewModel 项目的引用),然后将控件的 DataContext 设置为ViewModel 对象并将它们的属性绑定到您的 ViewModel 对象的公开属性。
在学习 WPF 时,您会发现并需要了解绑定涉及的大量细节,但正如我所说,这是您应该采取的非常基本的行动路线。
【讨论】: