我有这些 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(这没关系,我只需绑定到 Record-DataTemplate 中的 ItemsControl)但是当我想显示按钮时出现问题每个 ComponentViewModel 的正确位置。我只引用了给定的 ComponentViewModels 而不是它们的视觉表示(在 DataTemplate 中定义的东西),所以我无法知道在哪里放置 3 个按钮。
有没有办法解决这个问题?或者对于这些要求,使用 ViewModels/DataTemplates 是否可能不是一个好主意,因此我应该使用 Control-derivates/ControlTemplates 吗?
提前致谢!