【问题标题】:Using C# how can I return the value of a toggle Switch from xaml使用 C# 如何从 xaml 返回切换开关的值
【发布时间】:2021-12-24 05:54:18
【问题描述】:

我在单独的文件中有两个 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() 转换为返回类型给了我一个关于 toggleSwitch1 的错误,说需要对象引用,因为它是非静态的。 如何拉取切换值并同步更新另一个 xaml 文件?

【问题讨论】:

  • 在您的问题之间,您所展示的内容并不清楚
  • 我展示的方法只是用于切换的关联 C#。我正在寻找一种与将返回其状态的切换一起使用的方法,甚至可能是另一种获取它并更新不同 xaml 切换的方法
  • 对不起,我不明白你想要什么,Ontoggled 是一个事件,你不能从一个事件中返回值
  • 是的,这是我的问题。那么我将如何编写一个从提供的 xaml 元素返回值的方法呢?

标签: c# xaml xamarin.android toggle


【解决方案1】:

使用 C# 如何从 xaml 返回切换开关的值

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

1.使用你提到的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.另一种方法是使用绑定方式。

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

请参考以下代码:

创建一个ViewModel类(例如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"/>

【讨论】:

  • 嗨@JM Wesierski,我已经好几天没有收到你的消息了。如果有什么我可以在这里提供帮助的,请告诉我。
  • 嘿,我没有收到任何错误,但这并没有同步我的切换。我对这条评论的回复有点太长了,所以我提出了一个新问题here。如果您能看一看,我将不胜感激!
  • 我刚刚回答了问题how can I return the value of a toggle Switch from xaml。如果你想在不同的页面同步切换,我会在你发布的新问题中给出答案。
  • 一个问题,一个线程。如果我的回答对这个问题Using C# how can I return the value of a toggle Switch from xaml 有用,您能否将其标记为已回答,以便帮助其他有类似问题的人。提前致谢。 :)
【解决方案2】:

sender 对象包含事件源,这里是 Switch

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

【讨论】:

    猜你喜欢
    • 2021-12-24
    • 1970-01-01
    • 2018-04-23
    • 1970-01-01
    • 1970-01-01
    • 2010-12-14
    • 1970-01-01
    • 1970-01-01
    • 2020-03-09
    相关资源
    最近更新 更多