我已经实现了Wiesław Šoltés'很棒的ZoomBorder,但是我在WPF和MVVM方面有些挣扎。为了问题的完整性,ZoomBorder是从UIElement继承的Border,它使用户可以缩放和平移继承边框的内容。它还具有重置缩放和平移的功能。
我想让ZoomBorder对某个 View 模型正在发布的事件使用react,以便在发布该事件时,ZoomBorder重置缩放。在我的实现中,ZoomBorderDataContextContentViewModel,它具有通过Autofac注入(inject)的IEventAggregator(Prism.Events)。理想情况下,我希望将事件聚合器直接注入(inject)ZoomBorder,以便它可以订阅事件,但是我不能,因为构造函数需要无参数。
因此ContentViewModel必须订阅该事件,但是我如何从ZoomBorder调用ResetContentViewModel方法呢?我知道我会违反MVVM,但是我不知道该怎么做。我考虑过通过依赖项属性使ZoomBorder公开Command,但是Reset代码必须位于 View 模型上,而不能。

最佳答案

您可以在 View 或控件内部使用ServiceLocator来解析容器中的类型。

public ZoomBorder()
{
   _eventAggregator = ServiceLocator.Current.GetInstance<IEventAggregator>();
}
如果您使用AutoFac和不带Prism的事件聚合器,则可以使用Autofac.Extras.CommonServiceLocatorregister 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/

10-13 02:38