C# 检查后锁定切换按钮

C# 检查后锁定切换按钮,c#,wpf,mvvm,C#,Wpf,Mvvm,我有一个用MVVM模式构建的GUI。在视图中有一个切换按钮,该按钮被选中属性绑定到ViewModel中的bool属性 现在,只允许在视图上将ToggleButton(以及ViewModel中的bool属性)从false转换为true。一个方法重置ViewModel中的bool属性,因此用户可以再次将切换按钮从false切换到true 如何在不使用IsEnabled属性的情况下锁定视图中的切换按钮 谢谢。使用iEnabled有什么问题?如果你的用户点击一个常规的切换按钮而什么也没发生,他们会很快感

我有一个用MVVM模式构建的GUI。在视图中有一个切换按钮,该按钮被选中属性绑定到ViewModel中的bool属性

现在,只允许在视图上将ToggleButton(以及ViewModel中的bool属性)从false转换为true。一个方法重置ViewModel中的bool属性,因此用户可以再次将切换按钮从false切换到true

如何在不使用
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键。但是,画布将阻止所有和任何鼠标交互。