为什么无法对ToggleButton的IsChecked属性进行单向绑定?

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

问题是为什么支持ICommand但不支持OneWay绑定? 我可以设置TwoWay绑定,但是当使用命令时,这是一个不好的想法,因为实际操作由命令处理,不应通过TwoWay绑定进行重复,并且有时不可能。在我的情况下, Command=TogglePlayPause IsChecked={Bind to IsMediaPlaying} IsMediaPlaying应该是只读的。

因此,请告诉我如何使用与命令并绑定其IsChecked属性?

1个回答

5

您可以通过继承 ToggleButton 并重写按钮点击时发生的操作来编写自己的 OneWayToggleButton

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

然后,IsChecked 属性不会被按钮本身修改,只能通过绑定进行更改。但是因为我们仍在使用 ToggleButtonIsChecked 属性,所以控件的外观和行为将保持正常。


我无法使用这个,因为接口是由其他人创建的,而我只有它的 DLL 文件。我通过代码进行动态绑定,所以无法使用自己的覆盖类。 - Mohammad Nikravan
然后使用您自己的中间属性进行双向绑定,并在绑定更改时将其设置回正确的值。 - Rick Sladkey
实际上,我已经使用非空集合访问器应用了双向绑定,但这不是一个好的解决方案,当然它可以工作,但我应该改变我框架中所有只读属性仅仅为了ToggleButton。如果没有其他方法,我认为Silverlight团队应该解决这个问题。 - Mohammad Nikravan
你如何使用中间属性?我尝试让命令设置一个属性并将IsChecked绑定到该属性,但它没有起作用。用户交互仍然会切换按钮的开/关状态,而不管绑定如何。不过,OneWayToggleButton解决方案非常好! - angularsen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接