使用 C# 我如何 return 切换开关的值从 xaml

Using C# how can I return the value of a toggle Switch from xaml

我在单独的文件中有两个 xaml 开关,我想同时更新它们(如果一个打开另一个也应该打开(反之亦然)。我在 xaml 中的第一个开关是:

<Switch Grid.Column="1" x:Name="toggleSwitch1" IsToggled="true" Toggled="OnToggled"/> 使用方法

 void OnToggled(object sender, ToggledEventArgs e)
    {
        //updateConsentValueForCategory();
        if (toggleSwitch1.IsToggled)
        {
            Console.WriteLine("Toggled on");
        }
        else
        {
            Console.WriteLine("Toggled off");
        }
    }

将 OnToggled() 转换为 return 类型会给我一个关于 toggleSwitch1 的错误,说需要对象引用,因为它是非静态的。 我怎样才能拉动切换值并同步更新另一个 xaml 文件?

发送者对象包含事件源,这里是 Switch

 void OnToggled(object sender, ToggledEventArgs e)
    {
        //updateConsentValueForCategory();
        var switch = (Switch)sender;
        if (switch.IsToggled)
        {
            Console.WriteLine("Toggled on");
        }
        else
        {
            Console.WriteLine("Toggled off");
        }
    }

Using C# how can I return the value of a toggle Switch from xaml

您可以使用多种方法来实现。

如您所述,

1.use Switch 事件 Toggled

您可以参考以下代码:

private void OnToggled(object sender, ToggledEventArgs e)
{
    Switch mySwitch1 = (Switch)sender;
    if (mySwitch1.IsToggled)
    {
        Console.WriteLine("Toggled on" );
    }
    else
    {
        Console.WriteLine("Toggled off");
    }
}

2.Another方法是使用绑定方式

只需为当前页面创建一个 ViewModel(例如TestPage1)并为 Switch 的 属性 IsToggled 创建一个字段(例如 SwithOne)。

请参考以下代码:

创建一个ViewModel class(例如MyViewModel.cs)并创建字段SwithOne。使ViewModel实现接口INotifyPropertyChanged

 public class MyViewModel: INotifyPropertyChanged
{
    private bool swithOne;
    public bool SwithOne
    {
        set
        {
            if (swithOne != value)
            {
                swithOne = value;
                OnPropertyChanged("SwithOne");
            }
        }
        get
        {
            return swithOne;
        }
    }


    public MyViewModel()
    {
        SwithOne = true; // assign a value for `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;

}

TestPage1.xaml.cs.

public partial class TestPage1 : ContentPage
{
     MyViewModel myViewModel;

    public TestPage1()
    {
        InitializeComponent();

        myViewModel = new MyViewModel();
        BindingContext = myViewModel;
    }

    private async void Button_Clicked(object sender, EventArgs e)
    {
        await Navigation.PushModalAsync( new TestPage2(myViewModel.SwithOne));
    }

}

TestPage1.xaml

        <Switch x:Name="toggleSwitch1" IsToggled="{Binding SwithOne}"   HorizontalOptions="Center">
        </Switch>
        <Button  Text="navigate"  Clicked="Button_Clicked"/>