c# - 无法从视图上的视图模型的只读属性绑定数据
问题描述
我有一个像这样设计的视图模型类,我有一个只有吸气剂的属性
public string TPKUri
{
get { return localMapService.UrlMapService; }
}
现在你可以从下图中看到我UrlMapService
在TPKUri
但是当我试图TPKUri
在视图中获得价值时。例如,当我在MainWindow.xaml
<Grid>
<Label Content="{Binding Source={StaticResource VM}, Path=BasemapUri}" />
</Grid>
它什么也不显示。
class MainViewModel : INotifyPropertyChanged
{
public Model myModel { get; set; }
public LocalMapService localMapService;
public event PropertyChangedEventHandler PropertyChanged;
public MainViewModel()
{
myModel = new Model();
CreateLocalService();
}
public string TPKUri
{
get { return localMapService.UrlMapService; }
}
public string MPKMap
{
get { return myModel.MPKPackage; }
set
{
this.myModel.MPKPackage = value;
OnPropertyChanged("MPKUri");
}
}
public async void CreateLocalService()
{
localMapService = new LocalMapService(this.MPKMap);
await localMapService.StartAsync();
}
protected void OnPropertyChanged([CallerMemberName] string member = "")
{
var eventHandler = PropertyChanged;
if (eventHandler != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(member));
}
}
}
这是完整的MainWindow.xmal
<Window x:Class="MPK.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:esri="http://schemas.esri.com/arcgis/runtime/2013"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:MPK.ViewModels"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Window.Resources>
<local:MainViewModel x:Key="VM"/>
</Window.Resources>
<Grid>
<Label Content="{Binding Source={StaticResource VM}, Path=BasemapUri}" />
<esri:MapView x:Name="MyMapView" Grid.Row="0" LayerLoaded="MyMapView_LayerLoaded" >
<esri:Map>
<esri:ArcGISDynamicMapServiceLayer ID="Canada" ServiceUri="{Binding Source={StaticResource VM}, Path=TPKUri}"/>
</esri:Map>
</esri:MapView>
</Grid>
</Window>
解决方案
你localMapService.StartAsync();
是一个异步方法,但你所有的属性都没有等待结果。因此,您的 XAML 绑定可能会在您的服务完成启动之前获取属性的值。
您应该做的是在 `localMapService.StartAsync(); 之后通知属性更改;
public async void CreateLocalService()
{
localMapService = new LocalMapService(this.MPKMap);
await localMapService.StartAsync();
// Notify that the service initialization is completed.
OnPropertyChanged(nameof(TPKUri));
OnPropertyChanged(nameof(MPKMap));
}
推荐阅读
- c# - INotifyDataErrorInfo(有时)不起作用
- python - 下面如何计算 dy(Tensorflow 中的上游梯度)?
- swift - SwiftUI - 如何获取一定范围内的随机数
- javascript - Graphql查询变量在reactjs中没有更新
- amazon-web-services - 无法设置云端 cookie
- jquery - 在数据表jQuery中更改复选框状态为true的类按钮
- autocomplete - 如何将 React admin AutoCompleteInput 与远程数据一起使用?
- php - dockerfile 连接外部数据库
- anonymous - Json 输入意外结束。无法转换为 json 对象
- sql - 在 PostgreSQL 中加入两个连接