如何编写返回OF XAML切换开关的值的方法?

人气:201 发布:2022-10-16 标签: c# xaml toggle

问题描述

我在单独的文件中有两个XAML切换,我希望同时更新它们(如果打开了一个,那么另一个也应该打开(反之亦然)。我在XAML中的第一个开关是:

<Switch Grid.Column="1" x:Name="toggleSwitch1" IsToggled="true" Toggled="OnToggled"/>
使用C#如何返回此开关的布尔值,以便可以同时更新另一个开关?那么,一旦检索到该值,我如何更新另一个交换机的切换状态的XAML?

推荐答案

您的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));
    }
}

然后在WindowWindowWindowXAML中将绑定设置为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>

示例中两个Window的代码隐藏相同:

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;
        }
    }
}
当从主实例调用示例Windowtoshow时,您创建了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。

710