MVVM中控件的调用方法

本文关键字:调用 方法 控件 MVVM | 更新日期: 2023-09-27 18:13:01

我目前正在与ArcGIS运行时SDK . net工作,在那里我想有地图的当前视口绑定到我的视图模型上的属性。然而,视图端口(表示为Extent)没有setter,尽管它是一个依赖属性。

为了设置视口,我需要调用控件上的方法。但如何从视图模型中做到呢?我已经在SO上发现了类似的问题,但大多数问题都是用来回答的。视图模型不应该意识到视图。

MVVM中控件的调用方法

我同意这一点,但不幸的是,我不能改变这样一个事实,即专有控件上属性的setter与我可以绑定并从中读取值的实际属性是不同的方法。

有许多可能被认为是MVVM友好的方法来完成这项工作。我建议的是,你把你的ArcGIS视图包装在一个你可以完全控制的自定义控件中。这样你就可以公开你需要的依赖属性,并在你的自定义控件中处理它们的setter。

我几乎每次使用第三方组件时都使用这个方法,这样我使组件与我的其他代码松散耦合,并且我可以很容易地替换它们。

您可以使用附加属性来推动使VM请求任何侦听视图转到某个视点。我在这里的示例中使用它:

https://github.com/Esri/arcgis-runtime-demos-dotnet/blob/master/src/TurnByTurn/RoutingSample.Shared/CommandBinder.cs

在您的VM中,您只需为一个视点启动INPC:

public Viewpoint ViewpointRequested
{
    get { return m_ViewpointRequested; }
    private set
    {
        m_ViewpointRequested = value;
        RaisePropertyChanged("ViewpointRequested");
    }
}

最后将它绑定到MapView的附加属性:

<esri:MapView Map="{Binding Map}"
             local:CommandBinder.RequestView="{Binding ViewpointRequested}" />