Предоставить элемент 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" />
Но вы должны спросить себя, почему вы это делаете, так как это, вероятно, запах кода, который вы должны избегать.