通过视图模型表达式身体成员公开的对象的ObservableCollection属性不会更新视图

时间:2017-11-06 16:32:35

标签: c# mvvm xamarin.forms

我的视图模型有一个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>,它将服务的集合公开为表达式身体属性:

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后,我的一叠按钮没有更新。

1 个答案:

答案 0 :(得分:0)

为了更新UI,必须触发PropertyChanged事件。当您执行AppToolbarService.Buttons但您的用户界面未绑定到PropertyChanged时,Add()可能会发出AppToolbarService个事件,它会绑定到您的ViewModel。

我认为AppToolbarService.Buttons的{​​{1}}事件不会影响您的ViewModel的PropertyChanged集合。

为了完成这项工作,您需要直接修改ViewModel的Buttons集合,或者需要在ViewModel的Buttons集合上触发PropertyChanged个事件,这可能需要一些奇怪/糟糕的代码,因为您的服务不应该直接连接到您的ViewModel。