ToggleButton IsChecked不遵守绑定属性

时间:2015-07-23 18:54:25

标签: wpf wpf-controls

所以我有一个切换按钮如下:

  <ToggleButton 
      IsChecked="{Binding IsButtonChecked, Mode=OneWay}"
      Command="{Binding DoNothing}"
      CommandParameter="{Binding ServerViewModel}"
      Content="Click Me!"></ToggleButton>

IsButtonChecked = false

的初始值

当我单击切换按钮时,ICommand正确触发(绑定到RelayCommand),此命令对CanExecute返回false。 WPF ToggleButton的状态现在是Checked = true,但是支持的模型仍然是 IsButtonChecked = false 。为什么UI更新为已检查状态,即使绑定属性没有?

旁注

我能够阻止UI更新的唯一方法是创建反向属性 IsButtonNotChecked 。然后我将该属性绑定到XAML中的 IsEnabled 。这可以防止在当前启用状态时发生按钮单击。

2 个答案:

答案 0 :(得分:0)

您将绑定模式设置为OneWay,将其设置为TwoWay

<ToggleButton Command="{Binding DoNothing}"
              CommandParameter="{Binding ServerViewModel}"
              Content="Click Me!"
              IsChecked="{Binding IsButtonChecked,
                                  Mode=TwoWay}" />

答案 1 :(得分:0)

为了它的价值,这就是我所做的......它看起来非常笨拙。

我将绑定模式设置为TwoWay。它看起来不像OneWay绑定尊重IsChecked属性。

  <ToggleButton 
      IsChecked="{Binding IsButtonChecked, Mode=TwoWay}"
      Command="{Binding DoNothing}"
      CommandParameter="{Binding ServerViewModel}"
      Content="Click Me!"></ToggleButton>

其次,我没有反对IsButtonChecked的mutator属性。

 public bool IsButtonChecked
        {
            get
            {
                return _isButtonChecked;
            }
            set
            {
                // Prevents the IsButtonCheckedfrom incorrectly being set to a
                // enabled state, yet the model is false
                // IsButtonCheckeddoesn't seem to respect OneWay binding.               
            }
        }

然后在代码后面,我更新_isButtonChecked属性并调用INotifyPropertyChanged事件。

internal void ShouldBeChecked(bool isChecked)
{ 
_isButtonChecked = isChecked;
 OnPropertyChanged("IsButtonChecked"); 
}

虽然真的很笨重......奇怪的是ToggleButton并不尊重绑定属性......