WPF:装饰 ViewModel?

标签 wpf mvvm datatemplate adorner

我有这些 ViewModel:RecordViewModel、ComponentViewModel,其中 RecordViewModel 本质上是几个 ComponentViewModel 的容器。

这些 ViewModel 的显示当前由 DataTemplates 处理,看起来像这样:

<DataTemplate DataType="{x:Type vm:RecordViewModel}" >
    <ItemsControl ItemsSource={Binding Components} />
</DataTemplate>

<DataTemplate DataType="{x:Type vm:ComponentViewModel}" >
    <TextBox Text={Binding Name} />
</DataTemplate>

我现在想提供的是一种更改 ComponentViewModel 显示顺序并从列表中删除某个 ComponentViewModel 的方法。我开始这样做是通过操作 ComponentViewModel 的 DataTemplate 并添加提供这些功能的按钮(单击将触发 ComponentViewModel 上的一个方法,该方法将(通过对 RecordViewModel 的引用“Parent”)调用 RecordViewModel 上的方法来执行操作(如 component.Parent.DeleteComponent(this))。

在我看来,这个问题是真正应该操纵组件位置/删除组件的记录而不是组件本身。

因此,我考虑使用附加到 RecordViewModel 并呈现按钮的装饰器来为每个 ComponentViewModel 提供功能(删除、上移、下移)。

然而,问题是这些装饰器需要引用他们装饰的 Control-derivate(这没关系,我只需绑定(bind)到 Record-DataTemplate 中的 ItemsControl)但是当我想显示按钮时出现问题每个 ComponentViewModel 的正确位置。我只引用了给定的 ComponentViewModels 而不是它们的视觉表示(在 DataTemplate 中定义的东西),所以我无法知道在哪里放置 3 个按钮。

有没有办法解决这个问题?或者对于这些要求,使用 ViewModels/DataTemplates 是否可能不是一个好主意,因此我应该使用 Control-derivates/ControlTemplates 吗?

提前致谢!

最佳答案

想出一些古怪的架构技巧来让你的 View 模型保持优雅和简单是没有意义的。 View 模型是古怪的架构技巧。

View 模型存在的唯一原因——严肃地说,唯一的原因——是对 View 建模。 View 是否有触发命令的按钮?命令属于 View 模型。

认为“移动组件确实是记录的责任”表面上看起来是明智的,但实际上这表明您正在忘记为什么您甚至首先创建了 View 模型。组件 View 是否有“上移”按钮?然后组件 View 模型需要一个“上移”命令,您可以将按钮绑定(bind)到该命令。因为这就是组件 View 模型的用途。

我之所以强调这一点,是因为这是我本周从 WPF 开发人员那里看到的第三个或第四个问题,他们似乎已经深深地陷入了 MVVM 模式的兔子洞,以至于他们忘记了它为什么存在。

关于WPF:装饰 ViewModel?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3219094/

相关文章:

.net - 对两个 ControlTemplate 使用相同的定义

c# - 使用 from...to 范围声明 int 变量

c# - EventTriggerBehavior Taped 未触发

wpf - DataTemplate 可以绑定(bind)到嵌套类吗?

wpf - 如何在资源字典的datatemplate中添加事件处理程序来控制

C# 将 XML 数据绑定(bind)到 ListView WPF

wpf - MenuItem_Click' 无效。 'Click' 不是 'System.Windows.Controls.DataGridTextColumn 上的事件

c# - 为什么我的 WPF 命令没有触发?

c# - 使用Mvvm的通用Windows应用程序,无法使用资源resw文件

wpf - 如果 ItemTemplate 中的 TextBox 获得焦点,则选择 ListBoxItem