Xamarin.Forms中如何将不同类的两个Switch绑定到同一bool属性?
问题根因
你现在两个页面的BindingContext绑定的是两个独立的MyViewModel实例,各自维护自己的SwithOne字段,自然状态不会同步:
AllowSaleToggleTab构造函数里执行了myViewModel = new MyViewModel();PC构造函数里也执行了myViewModel = new MyViewModel();
两个实例的属性变更不会互相通知,所以开关状态无法联动。
解决方案
方案1:使用单例模式共享ViewModel实例
修改MyViewModel,保证全局只有一个实例:
namespace XamarinDemoApp public class MyViewModel : INotifyPropertyChanged { // 全局唯一单例实例 private static MyViewModel _instance; public static MyViewModel Instance => _instance ??= new MyViewModel(); // 构造函数改为私有,禁止外部随意创建新实例 private MyViewModel() { SwithOne = true; } private bool swithOne; public bool SwithOne { set { if (swithOne != value) { swithOne = value; // 你已经加了[CallerMemberName]特性,不需要手动传属性名 OnPropertyChanged(); } } get => swithOne; } bool SetProperty<T>(ref T storage, T value, [CallerMemberName] string propertyName = null) { if (Object.Equals(storage, value)) return false; storage = value; OnPropertyChanged(propertyName); return true; } protected void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } public event PropertyChangedEventHandler PropertyChanged; }
然后两个页面的构造函数不要自己创建实例,直接引用单例即可:
// AllowSaleToggleTab.xaml.cs 和 PC.xaml.cs 统一修改 public AllowSaleToggleTab() { InitializeComponent(); BindingContext = MyViewModel.Instance; }
方案2:手动传递同一个ViewModel实例
如果你不想用单例,也可以在页面跳转逻辑里,只创建一次MyViewModel实例,再分别传给两个页面的构造函数:
// 跳转前只创建一次共享实例 var sharedVm = new MyViewModel(); var page1 = new AllowSaleToggleTab(sharedVm); var page2 = new PC(sharedVm);
对应修改两个页面的构造函数接收参数:
public partial class AllowSaleToggleTab : ContentPage { public AllowSaleToggleTab(MyViewModel vm) { InitializeComponent(); BindingContext = vm; } } // PC页面同理修改构造函数即可
可选优化&补充说明
- 你已经定义了
SetProperty辅助方法,可以简化属性的写法,不需要手动判断值变化和触发通知:
public bool SwithOne { get => swithOne; set => SetProperty(ref swithOne, value); }
- 保险起见可以在XAML绑定中显式指定双向绑定,确保开关状态变更会回写到ViewModel:
<Switch x:Name="ToggleSwitch1" IsToggled="{Binding SwithOne, Mode=TwoWay}"/>
- 注意你当前的属性名
SwithOne是拼写错误,正确应为SwitchOne,只要所有引用处拼写一致不影响功能,仅属于命名规范问题。
内容的提问来源于stack exchange,提问作者JM Wesierski
相关产品推荐
相关产品推荐

