包装视图并查看模型以添加横切关注点

时间:2016-03-09 14:45:22

标签: wpf mvvm view viewmodel

在非ui代码中,我习惯在接口实例周围添加装饰器/包装器,以增加日志记录,检查等交叉问题。

现在我正在寻找一种方法来为ui代码做类似的事情,这在我的应用程序中首先是视图模型。

一个例子:

我有一个像这样的样本模型

public class SampleViewModel
{
     // some properties
}

及其数据模板

<DataTemplate DataType={x:Type local:SampleViewModel>
     <!-- some content -->
</DataTemplate>

在某些情况下,我需要在视图模型的视图周围添加边框,可以对其进行动画处理以突出显示该区域。

此边框几乎可以添加到每个视图中,因此无法选择为此特定数据模板添加边框。

我最初的方法是添加一个这样的包装器视图模型:

public class BlinkingBorderWrapperViewModel
{
    public BlinkingBorderWrapperViewModel(IWantBeAbleToBlink innerVM)
    {
        InnerVM = innerVM;
    }

    public object InnerVM {get;private set;}

    // expose properties relevant for the blinking part
    // some may be retrieved via the interface `IWantBeAbleToBlink`
}

和数据模板

<DataTemplate DataType={x:Type local:BlinkingBorderWrapperViewModel}>
  <!-- draw the wrapping stuff -->
  <Border ...>
      <!-- include the wrapped vm -->
      <ContentControl Content={Binding Path=InnerVM} />
  <Border ...>
</DataTemplate>

接口IWantBeAbleToBlink用于与包装器交换数据(例如,如果它应该立即闪烁),并作为标签来检查它是否应该被包装。

到目前为止,对于具有这些缺点的单个包装器,这是有效的:

  • 视图模型需要存储包装的子视图模型,从而丢失类型信息(由于数据模板限制,包装器可能没有模板)。
  • 我不知道如何以可维护的方式添加第二个,第三个...包装器。
  • 我可能会添加几个包装器,但这必须从视图侧完成(即在XAML中,不是从视图模型中)

有没有办法在视图(模型)中添加横切关注点,以便添加多个方面,并且可以使用视图模型第一种方法?

我可能想补充的其他内容:

  • 锚标记,以便可以将视图(模型)导航到
  • 包装日志记录鼠标移动
  • 启用/停用的包装器
  • ...

来自评论:

UI逻辑漏洞?

在我看来,视图模型应该能够表达“被突出显示”的需要。这可以通过闪烁,背景变化,字体大小变化或视图实现的任何方式来完成。

由于视图模型不应该关心如何完成(并且执行突出显示的方式应该可以更改而无需调整视图模型),我只想提供一个名为{{1的接口(而不是IWantToBeAbleToBeHighlighted)可能只有一个开关。

包装视图模型中应包含暴露于视图的具体属性(闪烁频率,或新的字体大小或新的背景颜色)。

0 个答案:

没有答案