我需要能够在我的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" />
但是你应该问问自己为什么要这样做,因为这可能是你应该避免的代码气味。