【问题标题】:How to build a WPF control containing other controls based on a bound list如何基于绑定列表构建包含其他控件的 WPF 控件
【发布时间】:2017-01-31 09:10:35
【问题描述】:

我有一个看起来像的 ViewModel

public class MyViewModel
{
    public ObservableCollection<UserDefinedFieldBase> CustomFields { get; }
}
public class UserDefinedFieldBase
{
    public Point CustomLocation { ... }
}
public class CustomTextField : UserDefinedFieldBase
{
    public string Text { ... }
}

因此,每种可能的字段类型都有自己的类型并包含位置(可由用户自定义,因此它是 viewModel 的一部分,而不是视图。

问题部分: 实施控制的最佳方法是什么?我想过

  • 要么创建一个具有 ObservableCollection 类型的 DependencyProperty 的 UserControl,并为派生类使用带有 TemplateSelector 的适当容器
  • 无需通过自定义 DependencyProperty 即可工作/实现 ItemsControl 和 ItemsSource

【问题讨论】:

    标签: c# wpf mvvm


    【解决方案1】:

    这取决于控件的用途、它应该如何工作以及 UI 应该是什么样子。

    如果您想在视图中显示多个UserDefinedFieldBase 对象,您应该使用绑定到视图模型的 CustomFields 属性的 ItemsControl。不过,您仍然可以将 ItemsControl 添加到具有其他几个依赖项属性的 UserControl 中。

    如果您只想显示 UserDefinedFieldBase 列表,您可能根本不需要 UserControl。您可以只使用 ItemsControl 并使用 ItemTemplate 定义每个项目的外观。

    因此,您应该使用 ItemsControl,但根据您提供的信息,您是否需要创建 UserControl 有点不清楚。如果您想显示的不仅仅是带有项目列表的 ItemsControl,您可以将 ItemsControl 包装在 UserControl 中,根据需要添加几个其他元素。

    【讨论】:

    • 它基本上是一个面板,将支持许多不同的控件(文本/数字/图像/列表/地图),包括带有弹出对话框和代码隐藏的复杂控件。将有一个带有一列或多列的自动排列布局,以及一个使用配置中的坐标的用户定义的布局。用户可以在布局之间切换。为了保持在 mvvm 中,可以配置的所有内容都包含在视图模型中。
    • 那么创建一个具有依赖属性的用户控件,然后将它们绑定到视图模型的源属性?
    猜你喜欢
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-06
    • 1970-01-01
    • 1970-01-01
    • 2017-07-20
    • 1970-01-01
    相关资源
    最近更新 更多