如何编写一个返回 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));
然后在两个Window
s 的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>
示例中两个Window
s 的代码隐藏是相同的:
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 调用该示例 Window
s 到 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 切换开关的值的方法?的主要内容,如果未能解决你的问题,请参考以下文章