我有一个带有两个屏幕的应用程序。有一个按钮可以在一个屏幕上更改主题,我希望该值在另一屏幕上显示。这是我所拥有的:
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基础一样,它们是不同的。
答案 0 :(得分:1)
每个ViewModel都会创建自己的BaseViewModel实例。因此,基本上,您的内存中有两次BaseViewModel,它们不共享任何内容!
当您可以使用Xamarin Forms MessagingCenter时,可以解决您的问题。在两个ViewModel中,您都订阅了“ ThemeChanged”消息,并且在更改主题时,将发送“ ThemeChanged”方法。
或者,您也可以仅对TabPage使用一个ViewModel(但是在编写虚拟机时非常复杂,这不是最佳选择)