【问题标题】:WPF control with binding to collection [duplicate]具有绑定到集合的 WPF 控件 [重复]
【发布时间】:2018-04-14 15:22:27
【问题描述】:

我想实现一个 WPF 控件,该控件支持绑定到实现特定接口的数据项集合,也支持它们的模板,并根据接口中公开的属性排列这些项。这通常是一种可接受的做法吗?哪种策略更好用?

谢谢!

【问题讨论】:

    标签: wpf wpf-controls


    【解决方案1】:

    您提供的信息太宽泛了,所以我会尽量只介绍基础知识。

    是的,WPF 确实支持将控件绑定到集合。您可以绑定到任何实现IEnumerable 的集合。这意味着您可以绑定到 .NET 中可用的大多数集合类型,包括 List<T>

    如果您想要一个 active 绑定,即当您在基础集合中添加或删除项目时控件应该更新自身,您的集合必须实现更改通知。为此,您可以实现 INotifyPropertyChanged 或简单地使用 ObservableCollection<T>

    在前端,如果你想能够选择项目,你可以使用ListBox,如果你不想选择项目,可以使用ItemsControl

    您必须针对您的基础数据类型创建DataTemplates,并将它们分配给ItemsControl.ItemTemplateListBox.ItemTemplate,以便您的项目在控件中进行适当的查看。

    请注意,如果您想动态更新项目属性并希望 ItemsControl 或 ListBox 相应地更新其项目,则您的数据类型必须在其自身级别实现更改通知。为此,您可以实现 INotifyPropertyChanged 或从 ObservableObject 派生您的类(如果您使用 MVVM Light)。

    要更改项目在ItemsControl 中的排列方式,您可以将ItemsControl.ItemsPanel 设置为WPF 中可用的面板之一,例如StackPanelWrapPanelCanvas 等。

    普遍接受的做法是将您的项目分成(至少)两层(或 Visual Studio 中的项目);处理业务逻辑以及数据和操作的抽象存储的底层 ViewModel。此 ViewModel 不知道,因此独立于 UI。在这里,您可以在类和集合上实现更改通知,并公开您希望 UI 控件绑定到的公共属性。然后在 ViewModel 层之上,创建一个了解 ViewModel 层的 View 层(在 View 项目中添加 ViewModel 项目的引用),然后将控件的 DataContext 设置为ViewModel 对象并将它们的属性绑定到您的 ViewModel 对象的公开属性。

    在学习 WPF 时,您会发现并需要了解绑定涉及的大量细节,但正如我所说,这是您应该采取的非常基本的行动路线。

    【讨论】:

    • 感谢您的回复!我目前正在考虑将 ItemsControl 与 Canvas 一起用作面板,对我来说主要问题是如何根据绑定到这些元素的数据在画布内排列元素。
    • 是否有一点我可以将任何可能的插入挂钩到 Canvas 以进一步获取元素的 DataContext 以对其进行处理并相应地定位?
    • 或者我应该为此目的实现一个自定义面板吗?
    • 我知道这个问题很模糊,抱歉。为了缩小范围,我熟悉 WPF 基础知识、数据绑定、MVVM 方法等,对我来说,问题是在这种特殊情况下的策略,当元素需要在某个面板中任意排列时(画布或自定义我不知道) 根据他们的 DataContext。
    • 你的问题很模糊,但你的问题不是。如果您在原始帖子中包含此详细信息,对我们来说会容易得多。既然我们知道您想要什么,无论如何,请参阅 Clemens 指出的答案。这完全可以处理您正在处理的情况。
    猜你喜欢
    • 2010-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多