向 ViewModel 公开 XAML 元素以运行方法 Xamarin 窗体



我需要能够在我的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);

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

目前我的视图模型中有一个静态

public static MapView MapView;

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

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

这允许我在视图模型中执行此操作:

MapView.GraphicsOverlays.Add(MyOverlay);

所以问题是:

如何在不使用静态元素的情况下将元素公开到我的视图模型? || 如何对视图模型中的元素运行方法?

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

可以在 XAML 中绑定GraphicsOverlays

<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" />

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

相关内容

  • 没有找到相关文章

最新更新