首页 > 解决方案 > 无法从视图上的视图模型的只读属性绑定数据

问题描述

我有一个像这样设计的视图模型类,我有一个只有吸气剂的属性

  public string TPKUri
    {
        get { return localMapService.UrlMapService; }
     }

现在你可以从下图中看到我UrlMapServiceTPKUri

在此处输入图像描述

但是当我试图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>

标签: c#wpfmvvmmodel-view

解决方案


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));
}

推荐阅读