【问题标题】:Why could not do OneWay binding to ToggleButton IsChecked property?为什么不能将 OneWay 绑定到 ToggleButton IsChecked 属性?
【发布时间】:2011-06-20 09:09:46
【问题描述】:

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

问题是为什么 ToggleButton 支持 ICommand 但不支持 OneWay 绑定? 我可以设置 TwoWay 绑定,但 ToggleButton 使用 Command 时是个坏主意,因为 Command 处理的实际操作不应该与 TwoWay 绑定重复,有时也不可能。就我而言 命令=切换播放暂停 IsChecked={绑定到 IsMediaPlaying} IsMediaPlaying 应该是只读的。

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

【问题讨论】:

    标签: wpf binding togglebutton


    【解决方案1】:

    您可以通过从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。我用代码做动态绑定,所以我不能使用我自己的覆盖类。
    • 然后用你自己的中间属性做一个双向绑定,当它被绑定改变时,将它设置回正确的值。
    • 实际上我已经应用了非空集评估器的 2 路绑定,但它看起来不是很好的解决方案,当然它可以工作,但我应该只为 ToggleButton 更改我的所有框架只读属性。如果没有其他办法,我认为 Silverlight 团队应该解决这个问题。
    • 您如何建议使用中间属性?我尝试让命令设置一个属性并将 IsChecked 绑定到该属性,但它不起作用。无论绑定如何,用户交互仍然会打开/关闭按钮。不过 OneWayToggleButton 解决方案效果很好!
    猜你喜欢
    • 2011-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-04
    • 1970-01-01
    • 2011-06-25
    • 2015-07-24
    相关资源
    最近更新 更多