[英]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.Buttons
的PropertyChanged
事件不會冒泡到ViewModel的Buttons
集合。
為了使這項工作,您可能需要修改視圖模型的Buttons
直接收集,或者你需要觸發PropertyChanged
你的視圖模型的事件Buttons
集合這可能需要一些怪異/可憐的代碼,因為你的服務不應該直接連接到您的視圖模型像那。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.