我的视图模型有一个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
后,我的一叠按钮没有更新。
答案 0 :(得分:0)
为了更新UI,必须触发PropertyChanged
事件。当您执行AppToolbarService.Buttons
但您的用户界面未绑定到PropertyChanged
时,Add()
可能会发出AppToolbarService
个事件,它会绑定到您的ViewModel。
我认为AppToolbarService.Buttons
的{{1}}事件不会影响您的ViewModel的PropertyChanged
集合。
为了完成这项工作,您需要直接修改ViewModel的Buttons
集合,或者需要在ViewModel的Buttons
集合上触发PropertyChanged
个事件,这可能需要一些奇怪/糟糕的代码,因为您的服务不应该直接连接到您的ViewModel。