You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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页面同理修改构造函数即可

可选优化&补充说明

  1. 你已经定义了SetProperty辅助方法,可以简化属性的写法,不需要手动判断值变化和触发通知:
public bool SwithOne
{
    get => swithOne;
    set => SetProperty(ref swithOne, value);
}
  1. 保险起见可以在XAML绑定中显式指定双向绑定,确保开关状态变更会回写到ViewModel:
<Switch x:Name="ToggleSwitch1"  IsToggled="{Binding SwithOne, Mode=TwoWay}"/>
  1. 注意你当前的属性名SwithOne是拼写错误,正确应为SwitchOne,只要所有引用处拼写一致不影响功能,仅属于命名规范问题。

内容的提问来源于stack exchange,提问作者JM Wesierski

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 18:15:03