0

我需要能够在我的 ViewModel 中的 XAML 元素上运行方法,我有 3 个文件 - DataPrepPage.cs、DataPrepPage.xaml 和 DataPrepViewModel.cs。

在我的 XAML(DataPrepPage.xaml) 页面中,我有这样的元素:

<esriUI:MapView x:Name="MapElement" 
                Map="{Binding Map}"/>

我在父网格元素上设置绑定上下文,如下所示:

<Grid.BindingContext>
     <local:DataPrepViewModel/>
</Grid.BindingContext>

当然,我可以像这样在代码隐藏中访问我的 MapView 元素和方法,例如:

MapElement.GraphicsOverlays.Add(MyOverlay);

所以问题是我需要能够在 ViewModel 中执行此操作,但 x:Name 不会将它公开给我的 ViewModel。

目前我的 ViewModel 中有一个静态的

public static MapView MapView;

我在页面代码隐藏的构造函数中将我的元素分配给它:

    public DataPrepPage ()
    {
        InitializeComponent ();
        DataPrepViewModel.MapView = MapElement;
    }

这允许我在我的 ViewModel 中执行此操作:

MapView.GraphicsOverlays.Add(MyOverlay);

所以问题是:

如何在不使用静态的情况下将元素公开给我的 ViewModel?|| 如何在 ViewModel 中的元素上运行方法?

4

1 回答 1

1

MVVM 背后的整个想法是您的视图和视图模型是解耦的。您在问如何将它们再次耦合在一起。简短的回答:不要。

GraphicsOverlays您可以在 XAML中绑定:

        <esri:MapView x:Name="MapView1" Height="517" MapViewTapped="MapView1_MapViewTapped">

            <!-- Add a Map. -->
            <esri:Map x:Name="Map1">

                <!-- Add a backdrop ArcGISTiledMapServiceLayer. -->
                <esri:ArcGISTiledMapServiceLayer ID="myArcGISTiledMapServiceLayer" 
                  ServiceUri="http://services.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Light_Gray_Base/MapServer" />

            </esri:Map>

            <!-- Add a MapView.GraphicsOverlays collection. -->
        <esri:MapView.GraphicsOverlays>

            <!-- Add a GraphicsOverlay to hold Graphics added via code behind from a FindTask operation. Set the Renderer to draw the polygon graphics. -->
            <esri:GraphicsOverlay Renderer="{StaticResource mySimpleRenderer}"/>

        </esri:MapView.GraphicsOverlays>

    </esri:MapView>

更完整的文档在这里

因此,创建所需类型的其他属性或DependencyProperty实例,然后使用 XAML 绑定到这些新的视图模型属性。

为了完整起见,您可以像这样公开 XAML 元素:

<Button x:Name="MyButton" x:FieldModifier="public" />

但是您应该问自己为什么要这样做,因为这可能是您应该避免的代码异味。

于 2018-06-16T11:12:22.160 回答