为什么无法对 ToggleButton IsChecked 属性进行 OneWay 绑定?

Moh*_*van 4 wpf binding togglebutton

ToggleButton 支持 ICommand,因此我创建了许多命令,例如 TogglePlayPause、ToggleMute,它工作正常,但我也需要绑定 IsChecked 属性,以便其选中状态始终显示正确的状态。但是当我为 ToggleButton 创建 OneWay 绑定模式并且按下 ToggleButton 时,绑定将会丢失。

问题是为什么ToggleButton支持ICommand但不支持OneWay绑定?我可以设置 TwoWay 绑定,但是当 ToggleButton 使用 Command 时这是个坏主意,因为 Command 处理的实际操作不应该与 TwoWay 绑定重复,有时也是不可能的。在我的例子中 Command=TogglePlayPause IsChecked={Bind to IsMediaPlaying} IsMediaPlaying 应该是只读的。

那么请告诉我如何将 ToggleButton 与 Command 一起使用并绑定其 IsChecked 属性?

Ric*_*key 5

OneWayToggleButton您可以通过派生ToggleButton并覆盖单击按钮时发生的情况来编写自己的代码:

public class OneWayToggleButton : ToggleButton
{
    protected override void OnClick()
    {
        RaiseEvent(new RoutedEventArgs(ClickEvent, this));
        if (Command != null && Command.CanExecute(CommandParameter))
            Command.Execute(CommandParameter);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后IsChecked不会被按钮本身修改,只能通过绑定更改。但由于我们仍在使用IsChecked的属性ToggleButton,因此控件的外观和行为将正常。