如何编写一个返回 xaml 切换开关的值的方法?

Posted

技术标签:

【中文标题】如何编写一个返回 xaml 切换开关的值的方法?【英文标题】:How can I write a method that returns the value of a of xaml toggle switch? 【发布时间】:2021-12-24 07:51:21 【问题描述】:

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

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

使用 C# 如何返回此开关的布尔值,以便我可以同时更新另一个开关?那么一旦检索到该值,我该如何更新另一个开关的切换状态的 xaml?

【问题讨论】:

恕我直言,您不应返回 IsToggled 属性的任何值。取而代之的是,您应该将两个 Switch 控件绑定到相互的 bool 属性。更改该属性值将影响Switch 控件。同时切换一个Switch 将切换另一个,反之亦然。 这听起来完全符合我的需要。我已经对其进行了更多研究,但您有任何代码或文档可以指点我吗? 添加示例,请自行尝试。 【参考方案1】:

据我所知,您的 Switch 控件意味着您使用 UWP,但我不确定。

无论如何,想法是将两个控件IsToggled 属性绑定到某些ViewModel的相同属性:

using System.ComponentModel;
using System.Runtime.CompilerServices;

namespace MyWPFApp

    public class ControlsViewModel : INotifyPropertyChanged
    
        private bool switchToggled;
        public bool SwitchToggled
        
            get => switchToggled;
            set
            
                switchToggled = value;
                OnPropertyChanged(nameof(SwitchToggled));
            
        

        public ControlsViewModel()  

        public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChanged([CallerMemberName]string propertyName = "") => 
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    

然后在两个Windows 的XAML 中设置绑定到Switch 控件(在我的示例中-CheckBox 控件):

<!-- Window 1 -->
<Window x:Class="MyWPFApp.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:MyWPFApp"
        mc:Ignorable="d"
        Title="Window 1" Height="100" Width="300">
    <Grid>
        <CheckBox Content="Window1 CheckBox"
                  IsChecked="Binding SwitchToggled"/>
                  <!-- Replace IsChecked to IsToggled property -->
    </Grid>
</Window>

<!-- Window 2 -->
<Window x:Class="MyWPFApp.Window2"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:MyWPFApp"
        mc:Ignorable="d"
        Title="Window 2" Height="100" Width="300">
    <Grid>
        <CheckBox Content="Window2 CheckBox" 
                  IsChecked="Binding SwitchToggled"/>
                  <!-- Replace IsChecked to IsToggled property -->
    </Grid>
</Window>
示例中两个Windows 的

代码隐藏是相同的:

using System.Windows;

namespace MyWPFApp

    public partial class Window1 : Window // or public partial class Window2
    
        public Window1(ControlsViewModel cvm) // or public Window2
        
            InitializeComponent();
            DataContext = cvm;
        
    

当从 Main 调用该示例 Windows 到 show 时,您将创建 ControlsViewModel 实例并将其传递给两者:

using System.Windows;

namespace MyWPFApp

    public partial class MainWindow : Window
    
        public MainWindow()
        
            InitializeComponent();

            var cvm = new ControlsViewModel();

            new Window1(cvm).Show();
            new Window2(cvm).Show();
        
    

因此选中/取消选中(切换/取消切换)其中一个会影响另一个,反之亦然。此外,您可以在某处更改代码中的SwitchToggled,这也会影响这两个控件。

请注意,这只是尝试解释该想法的示例。更多 MVVM 模式解释和示例,您可以在 MSDN 找到。

【讨论】:

感谢您的回答,但我相信由于我正在使用 xamarin android,因此 Windows 给了我错误。我已经转发了我的问题here,如果你能看看我有什么,我将不胜感激! @JM Wesierski,我在那里添加了评论。再次阅读我的答案,尤其是 MainWindow 的一部分。如您所见,我只创建了 1 个 ViewModel 实例,并将该实例作为每个子窗口传递。我不会在每个子窗口中创建单独的实例,只是将 MainWindow 传递的一个指定为 DataContext。

以上是关于如何编写一个返回 xaml 切换开关的值的方法?的主要内容,如果未能解决你的问题,请参考以下文章

C语言返回多个值的方法

您如何使用 Bootstrap 5 和 simple_form 编写切换开关

jquery点击图标来回切换的几种方法(如开关

如何用python编写一个求分段函数的值的程序

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

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