检查后锁定ToggleButton

时间:2017-11-15 08:38:30

标签: c# wpf mvvm

我有一个用MVVM-Pattern构建的GUI。在View中有一个Toggle-Button,IsChecked属性绑定到ViewModel中的bool属性。

现在只允许在View上将ToggleButton(以及ViewModel中的bool属性)从false转为true。方法重置ViewModel中的bool属性,因此用户可以再次将Toggle-Button从false切换为true。

如何在不使用IsEnabled属性的情况下锁定视图中的切换按钮?

感谢。

3 个答案:

答案 0 :(得分:1)

我不知道为什么你不想使用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 local:ToggleButtonExtensions.CanNotUncheckByHand="True"/>

基本上它的作用是确保ToggleButton在手动取消选中时保持Checked。

答案 1 :(得分:0)

使用IsEnabled有什么问题?如果用户点击看似常规的切换按钮并且没有任何反应,他们很快就会感到沮丧。

如果你真的想沿着这条路走下去,你可以写这样的东西作为按钮的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");
    }

答案 2 :(得分:0)

虽然我强烈建议您使用IsEnabled属性,但使用IValueConverter将切换状态绑定到透明画布的可见性应该对您有用。

<Grid>
    <ToggleButton Content="Hello"/>
    <Canvas Background="Transparent" Visibility="Visible"/>
</Grid>

Here's a link to the MSDN page for the BooleanToVisibilityConverter