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

Posted

技术标签:

【中文标题】使用 C# 如何从 xaml 返回切换开关的值【英文标题】:Using C# how can I return the value of a toggle Switch from 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 元素返回值的方法呢? 【参考方案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");
        
    

【讨论】:

以上是关于使用 C# 如何从 xaml 返回切换开关的值的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Visual Studio 2019 中为 C# WPF 切换 XAML 中的行注释

如何获取切换类型复选框的值

如何使用 C# 反转 XAML PNG 图像的颜色?

Windows Phone 7 - 在列表框中切换开关

切换编程语言

如何从开关输入到数值之间切换?