如何在C#中获取XAML Toggle Switch值并同步多个开关状态
XAML开关双向同步实现方案
获取开关的布尔状态
你定义的Switch控件的IsToggled属性本身就是布尔类型,有两种获取方式:
- 直接通过控件名访问:
bool currentState = toggleSwitch1.IsToggled - 在
Toggled事件回调中通过事件参数获取:bool currentState = e.Value
示例事件代码:
private void OnToggled(object sender, ToggledEventArgs e) { bool toggleState = e.Value; // 直接拿到bool类型的开关状态 }
跨文件同步另一个开关状态
由于两个开关位于不同文件,推荐以下两种实现方式:
方案1:静态全局状态同步(轻量易实现)
- 先定义静态全局状态类,统一管理开关状态并通知变更:
public static class SharedSwitchState { private static bool _isToggled = true; public static bool IsToggled { get => _isToggled; set { if (_isToggled == value) return; _isToggled = value; StateChanged?.Invoke(null, value); } } // 状态变更通知事件 public static event EventHandler<bool> StateChanged; }
- 两个开关所在的页面都订阅状态变更事件,开关切换时更新全局状态:
// 页面构造函数中添加订阅 public YourPage() { InitializeComponent(); SharedSwitchState.StateChanged += (sender, newState) => { // 避免状态一致时重复触发事件 if (toggleSwitch1.IsToggled != newState) { toggleSwitch1.IsToggled = newState; } }; } // 开关Toggled事件处理 private void OnToggled(object sender, ToggledEventArgs e) { SharedSwitchState.IsToggled = e.Value; }
另一个开关所在页面的逻辑完全一致,即可实现双向同步。
方案2:MVVM绑定(适合已有MVVM架构的项目)
定义全局单例ViewModel,两个开关都双向绑定同一个属性:
- 全局ViewModel代码:
public class GlobalVm : INotifyPropertyChanged { public static GlobalVm Instance { get; } = new GlobalVm(); private bool _isToggled = true; public bool IsToggled { get => _isToggled; set { _isToggled = value; OnPropertyChanged(); } } public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } }
- 两个开关的XAML都修改为绑定该属性:
<Switch Grid.Column="1" IsToggled="{Binding Source={x:Static local:GlobalVm.Instance}, Path=IsToggled, Mode=TwoWay}"/>
无需额外编写事件处理代码即可自动实现双向同步。
内容的提问来源于stack exchange,提问作者JM Wesierski
相关产品推荐
相关产品推荐

