在非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
用于与包装器交换数据(例如,如果它应该立即闪烁),并作为标签来检查它是否应该被包装。
到目前为止,对于具有这些缺点的单个包装器,这是有效的:
有没有办法在视图(模型)中添加横切关注点,以便添加多个方面,并且可以使用视图模型第一种方法?
我可能想补充的其他内容:
在我看来,视图模型应该能够表达“被突出显示”的需要。这可以通过闪烁,背景变化,字体大小变化或视图实现的任何方式来完成。
由于视图模型不应该关心如何完成(并且执行突出显示的方式应该可以更改而无需调整视图模型),我只想提供一个名为{{1的接口(而不是IWantToBeAbleToBeHighlighted
)可能只有一个开关。
包装视图模型中应包含暴露于视图的具体属性(闪烁频率,或新的字体大小或新的背景颜色)。