Невозможно связать данные из свойства «Только для чтения» из представления Модель на представлении - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть класс модели представления, который спроектирован таким образом, и теперь у меня есть свойство только для получателя, как

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

. Как вы можете видеть из следующего изображения, я получаю URL UrlMapService вTPKUri

enter image description here

но когда я пытаюсь получить значение 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>

1 Ответ

0 голосов
/ 07 декабря 2018

Ваш 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));
}
...