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 高度?

在 Xamarin.Forms Shell 中隐藏 tabbedPage 的标题

xamarin.forms.shell 框架中页面上视觉元素的生命周期