我有一个用MVVM-Pattern构建的GUI。在View中有一个Toggle-Button,IsChecked
属性绑定到ViewModel中的bool属性。
现在只允许在View上将ToggleButton(以及ViewModel中的bool属性)从false转为true。方法重置ViewModel中的bool属性,因此用户可以再次将Toggle-Button从false切换为true。
如何在不使用IsEnabled
属性的情况下锁定视图中的切换按钮?
感谢。
答案 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