我已经实现了Wiesław Šoltés'很棒的ZoomBorder,但是我在WPF和MVVM方面有些挣扎。为了问题的完整性,ZoomBorder
是从UIElement
继承的Border
,它使用户可以缩放和平移继承边框的内容。它还具有重置缩放和平移的功能。
我想让ZoomBorder
对某个 View 模型正在发布的事件使用react,以便在发布该事件时,ZoomBorder
重置缩放。在我的实现中,ZoomBorder
的DataContext
是ContentViewModel
,它具有通过Autofac注入(inject)的IEventAggregator
(Prism.Events)。理想情况下,我希望将事件聚合器直接注入(inject)ZoomBorder
,以便它可以订阅事件,但是我不能,因为构造函数需要无参数。
因此ContentViewModel
必须订阅该事件,但是我如何从ZoomBorder
调用Reset
的ContentViewModel
方法呢?我知道我会违反MVVM,但是我不知道该怎么做。我考虑过通过依赖项属性使ZoomBorder
公开Command
,但是Reset
代码必须位于 View 模型上,而不能。
最佳答案
您可以在 View 或控件内部使用ServiceLocator
来解析容器中的类型。
public ZoomBorder()
{
_eventAggregator = ServiceLocator.Current.GetInstance<IEventAggregator>();
}
如果您使用AutoFac和不带Prism的事件聚合器,则可以使用Autofac.Extras.CommonServiceLocator
和register your container包到ServiceLocator
。var builder = new ContainerBuilder();
var container = builder.Build();
var csl = new AutofacServiceLocator(container);
ServiceLocator.SetLocatorProvider(() => csl);
关于wpf - 从ViewModel触发UIElement的操作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/63387717/