如何使用共享的VM从一个选项卡屏幕共享属性值到另一个选项卡屏幕?

时间:2019-02-26 10:24:12

标签: xamarin xamarin.forms

我有一个带有两个屏幕的应用程序。有一个按钮可以在一个屏幕上更改主题,我希望该值在另一屏幕上显示。这是我所拥有的:

public class BaseViewModel : ObservableObject
{
    string _theme;
    public string Theme { get => _theme; set => SetProperty(ref _theme, value); }
}

public partial class SettingsTabViewModel : BaseViewModel
{ }

public partial class HomeTabViewModel : BaseViewModel
{ }

“我的设置”屏幕绑定到“设置” VM,并且我更改了这样的值:

`vm.Theme = "X";`  

我在调试点使用进行检查,我可以看到BaseViewModel已更改。

我的主屏幕绑定到Home VM,我尝试观察如下值:

<Label Text="{Binding Theme}" />

我在OnAppearing的调试点上进行了检查,我可以看到BaseViewModel发生了更改。

请注意,VM很大,其他所有功能都可以正常工作。同样,setProperty方法已经使用了很多次并且可以工作,但是我遇到的问题只是共享VM参数Theme的问题。

有人知道会发生什么吗?就像我查看两个VM基础一样,它们是不同的。

1 个答案:

答案 0 :(得分:1)

每个ViewModel都会创建自己的BaseViewModel实例。因此,基本上,您的内存中有两次BaseViewModel,它们不共享任何内容!

当您可以使用Xamarin Forms MessagingCenter时,可以解决您的问题。在两个ViewModel中,您都订阅了“ ThemeChanged”消息,并且在更改主题时,将发送“ ThemeChanged”方法。

或者,您也可以仅对TabPage使用一个ViewModel(但是在编写虚拟机时非常复杂,这不是最佳选择)