C# 检查后锁定切换按钮
我有一个用MVVM模式构建的GUI。在视图中有一个切换按钮,该按钮被选中属性绑定到ViewModel中的bool属性 现在,只允许在视图上将ToggleButton(以及ViewModel中的bool属性)从false转换为true。一个方法重置ViewModel中的bool属性,因此用户可以再次将切换按钮从false切换到true 如何在不使用C# 检查后锁定切换按钮,c#,wpf,mvvm,C#,Wpf,Mvvm,我有一个用MVVM模式构建的GUI。在视图中有一个切换按钮,该按钮被选中属性绑定到ViewModel中的bool属性 现在,只允许在视图上将ToggleButton(以及ViewModel中的bool属性)从false转换为true。一个方法重置ViewModel中的bool属性,因此用户可以再次将切换按钮从false切换到true 如何在不使用IsEnabled属性的情况下锁定视图中的切换按钮 谢谢。使用iEnabled有什么问题?如果你的用户点击一个常规的切换按钮而什么也没发生,他们会很快感
IsEnabled
属性的情况下锁定视图中的切换按钮
谢谢。使用iEnabled有什么问题?如果你的用户点击一个常规的切换按钮而什么也没发生,他们会很快感到沮丧 如果你真的想沿着这条路走下去,你可以写这样的东西作为按钮的IsChecked属性的绑定源
private bool _isToggleButtonChecked;
public bool IsToggleButtonChecked
{
get { return _isToggleButtonChecked; }
set
{
if (_isToggleButtonChecked)
return;
_isToggleButtonChecked = value;
RaisePropertyChanged("IsToggleButtonChecked");
}
}
private void ResetIsToggleButtonChecked()
{
_isToggleButtonChecked = false;
RaisePropertyChanged("IsToggleButtonChecked");
}
尽管我强烈建议使用
IsEnabled
属性,但使用IValueConverter
将切换状态绑定到透明画布的可见性应该适合您
<Grid>
<ToggleButton Content="Hello"/>
<Canvas Background="Transparent" Visibility="Visible"/>
</Grid>
我不知道您为什么不想使用
IsEnabled
属性,但为了方便起见,这里有一个扩展属性,可以在一行代码中轻松完成(但这不是很MVVM,也没有那么有趣):
免责声明这与您描述的完全一样,但是有很多更简单的方法可以做到这一点。如果您不想因为灰显外观而使用
IsEnabled
,只需重新设置按钮样式,任何人都不会注意到差异
public static class ToggleButtonExtensions
{
public static readonly DependencyProperty CanNotUncheckByHandProperty = DependencyProperty.RegisterAttached(
"CanNotUncheckByHand", typeof(bool), typeof(ToggleButtonExtensions), new PropertyMetadata(default(bool), OnCanNotUncheckByHandPropertyChangedCallback));
private static void OnCanNotUncheckByHandPropertyChangedCallback(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs eventArgs)
{
if (!(dependencyObject is ToggleButton)) return;
if ((bool)eventArgs.NewValue)
((ToggleButton)dependencyObject).Click += OnClick;
else
((ToggleButton)dependencyObject).Click -= OnClick;
}
public static void SetCanNotUncheckByHand(DependencyObject element, bool value)
{
element.SetValue(CanNotUncheckByHandProperty, value);
}
private static void OnClick(object sender, RoutedEventArgs routedEventArgs)
{
((ToggleButton) sender).IsChecked = true;
}
public static bool GetCanNotUncheckByHand(DependencyObject element)
{
return (bool) element.GetValue(CanNotUncheckByHandProperty);
}
}
基本上,这是为了确保无论何时手动取消选中ToggleButton,它都保持选中状态。为什么不使用
IsEnabled
属性?这不是最简单的方法吗?通过这种方式,用户还可以看到,他无法手动取消选中,也不会因为尝试而感到沮丧。切换按钮应该能够在启用时进行切换。不允许用户这样做会让他们感到沮丧。禁用它,或使用其他控件。或者一种不同的模式,因为这是一种不常见且意外的UI模式。现在切换按钮可以更改,但VM将与视图不同步,而视图只能部分工作-切换按钮也可以使用键盘(例如空格)进行切换。这只会阻止用户单击它,实现这一点的一个更简单的方法是将ishitestvisible
设置为false
。它们可以用键盘进行切换,但如果画布阻止与之交互,则无法将焦点放在切换按钮上,因此,根据我的经验,你无法使用键盘来切换它。显然,这不是一个密闭的解决方案,但考虑到目前的情况,我相信它已经足够了。焦点可以通过选项卡设置,而且在第一次单击后焦点仍然会设置。您完全正确,希望OPs用户不要按Tab键。但是,画布将阻止所有和任何鼠标交互。