簡體   English   中英

通過視圖模型表達式強健的成員公開的對象的ObservableCollection屬性不會更新視圖

[英]ObservableCollection property of an object exposed through view model expression-bodied member does not update view

我的視圖模型具有一個AppToolbarService對象,該對象維護一個ObservableCollection<AppToolbarButton>屬性以及用於對該集合進行操作的幾種方法:

    public ObservableCollection<AppToolbarButton> Buttons { get; }

    public void AddButton(AppToolbarButton button, int index = -1)
    {
        if (Buttons.Any(buttonVm => buttonVm.Id == button.Id))
        {
            return;
        }

        if (index > -1)
        {
            Buttons.Insert(index, button);
        }
        else
        {
            Buttons.Add(button);
        }
    }

我的視圖模型有自己的ObservableCollection<AppToolbarButton> ,將服務的集合公開為表達式ObservableCollection<AppToolbarButton>的屬性:

protected IAppbarService AppbarService { get; }

public ObservableCollection<AppbarToolbarButton> Buttons => AppbarService.Buttons;

public MapViewModel(IAppbarService appbarservice){
    AppbarService = appbarService;

    NavigateToEngineer = new Command<MapView>(OnNavigateToEngineerAsync);

    AppbarService.AddButton(new AppToolbarButton(){
        Command = NavigateToEngineer
    });
}

public Command<MapView> NavigateToEngineer { get; }

private Task OnNavigateToEngineerAsync(MapView mapView) {
    AppbarService.RemoveAll();
    AppbarService.AddButton(new AppbarToolbarButton(/* the new button I want to display */));
    ...
}

這是我的看法:

<StackLayout Spacing="0" x:Name="MainAppContent">
        <views:ItemsStack ItemsSource="{Binding Buttons}" VerticalOptions="Start" HorizontalOptions="FillAndExpand" Orientation="Horizontal">
            <views:ItemsStack.ItemTemplate>
                <DataTemplate>
                    <Button Text="{Binding Title}" Command="{Binding Command}" CommandParameter="{x:Reference MainMapView}"/>
                </DataTemplate>
            </views:ItemsStack.ItemTemplate>
        </views:ItemsStack>
        <Grid VerticalOptions="FillAndExpand" HorizontalOptions="FillAndExpand">
            <esriUI:MapView x:Name="MainMapView"  Map="{Binding Map}" >

                <esriUI:MapView.InteractionOptions>
                    <ui:MapViewInteractionOptions IsRotateEnabled="False" />
                </esriUI:MapView.InteractionOptions>

                <esriUI:MapView.Behaviors>
                    <local:MapTappedBehavior Command="{Binding MapTapped}" />
                </esriUI:MapView.Behaviors>
            </esriUI:MapView>
        </Grid>
    </StackLayout>

OnNavigateToEngineerAsync之后,我的按鈕堆棧沒有更新。

為了更新UI,必須觸發PropertyChanged事件。 當您執行Add()時,您的AppToolbarService.Buttons可能會發出PropertyChanged事件,但您的UI並未綁定到AppToolbarService ,而是已綁定到ViewModel。

我認為AppToolbarService.ButtonsPropertyChanged事件不會冒泡到ViewModel的Buttons集合。

為了使這項工作,您可能需要修改視圖模型的Buttons直接收集,或者你需要觸發PropertyChanged你的視圖模型的事件Buttons集合這可能需要一些怪異/可憐的代碼,因為你的服務不應該直接連接到您的視圖模型像那。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM