Предоставить элемент XAML в ViewModel для запуска методов Xamarin Forms

Мне нужно иметь возможность запускать методы для элемента XAML в моей ViewModel, у меня есть 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?

1 ответ

Решение

Вся идея MVVM заключается в том, что ваш view и viewmodel отделены друг от друга. Вы спрашиваете, как соединить их снова. Краткий ответ: нет.

Вы можете связать 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" />

Но вы должны спросить себя, почему вы это делаете, так как это, вероятно, запах кода, который вы должны избегать.

Другие вопросы по тегам