Xamarin Forms App Shell OnPropertyChanged 未更新 FlyoutHeader 视图
Posted
技术标签:
【中文标题】Xamarin Forms App Shell OnPropertyChanged 未更新 FlyoutHeader 视图【英文标题】:Xamarin Forms App Shell OnPropertyChanged not updating for FlyoutHeader view 【发布时间】:2020-02-07 10:50:35 【问题描述】:我将视图模型中的文本属性绑定到 App Shell 滑出菜单的 FlyoutHeader 视图
当应用程序初始化时,所有更新事件都会正确触发,但是用户可以访问一个页面来更新他们的信息
我遇到的问题是,当您导航到此页面并执行更新时,FlyoutHeader 视图没有更新以响应视图模型
滑出菜单是否有特定的内容,这意味着一旦加载它,它就不会响应 onpropertychanged ... 而改变?好像不太对
来自 AppShell xaml
<Shell.FlyoutHeader>
<views:FlyoutHeader />
</Shell.FlyoutHeader>
来自背后的 Flyoutheader 代码
private LocationsViewModel _vm;
public FlyoutHeader()
InitializeComponent();
this.BindingContext = new LocationsViewModel();
protected override void OnBindingContextChanged()
_vm = BindingContext as LocationsViewModel;
_vm.PropertyChanged += _vm_PropertyChanged;
_vm.SetUserLocation();
用户通过 FlyoutHeader 视图中的按钮导航到“更改位置”页面,调用方式如下
await Shell.Current.GoToAsync("changelocation");
在我的调试日志中,我可以看到 LocationsViewModel 中的绑定对象“用户”确实触发了 OnPropertyChanged 以响应在此页面上所做的更改,但随后“返回”并打开弹出菜单没有任何改变,我可以看到PropertyChanged 没有针对该视图触发?
我认为 OnPropertyChanged 绑定的全部意义在于即使在加载视图时发生更新以导致视图响应?
【问题讨论】:
你到底为什么需要那个OnBindingContextChanged
?
它允许我将事件与 _vm_PropertyChanged 相关联,这是我有一些代码用新值更新适当标签的地方。在这种情况下,我使用它的目的非常简单,也许在 XAML 中绑定该标签意味着我不需要它,但它有什么不应该起作用的吗?
我取出代码(除了 this.BindingContext =)并将标签绑定到 XAML 中的 text 属性,但结果相同,当您转到其他页面并制作时它不会更新通过视图模型进行更改(我在另一个页面上放置了一条调试消息,确认标签文本在您更改它的页面的上下文中更新)。因此想知道这是否特定于 Flyout 的工作原理
好吧,我从您的 cmets 了解到的是,当您从当前视图模型中的其他位置进行更改时,即使触发了更改的属性,它也不起作用?如果是这种情况,您确定它是您的虚拟机的同一个实例吗?
很高兴为您提供帮助,如果这对您有用,请告诉我,我会添加答案!
【参考方案1】:
问题基本上是因为您正在创建同一个 ViewModel 的多个实例,所以问题是您正在尝试更改绑定到 ViewModel 中的属性的标题,然后绑定到您的 View,所以对于您的View 以反映您在 ViewModel 中所做的更改,如果有意义的话,它应该具有绑定到它的 ViewModel 实例!
这样做会解决您的问题
祝你好运!
【讨论】:
以上是关于Xamarin Forms App Shell OnPropertyChanged 未更新 FlyoutHeader 视图的主要内容,如果未能解决你的问题,请参考以下文章
如何将 Xamarin Forms Shell 集成到 MvvmCross 设置中
如何将 Xamarin Forms Shell 集成到 MvvmCross 设置中
Xamarin.Forms:处理导航工具栏按钮(Shell)
Xamarin.Forms.Shell:如何获取底部 TabBar 高度?