WPF ToggleButton 绑定(bind) IsChecked 禁用时

标签 wpf data-binding togglebutton ischecked

这是一个有点奇怪的问题。 (.NET 3.5sp1)

我有一个包含三个 ToggleButton 的 UserControl,每个 ToggleButton 都将 IsChecked 绑定(bind)到 UserControl 本身的不同依赖属性。其中两个默认为 true,一个默认为 false。

在应用程序启动时,UserControl 本身(及其内容)被禁用。稍后启用时,所有三个按钮都未按下;但是代码属性仍处于正确状态。

如果单击按钮,则属性将正确切换并且 UI(仅针对该按钮)将更新以反射(reflect)正确的状态(即单击一个看起来未按下但具有真实绑定(bind)值的按钮将显示第一次没有可见的变化,但将绑定(bind)值更新为 false)。第二次按下“故障”按钮将正常运行(如果它打开,按钮将按预期按下)。

如果启动时未禁用 UserControl,则按钮将正确显示(根据属性的状态)。

不幸的是,UserControl 应该在启动时被禁用,所以我无法在启用它的情况下真正启动;我希望有一个替代解决方案。有什么想法吗?

(我试过将属性默认设置为 false,然后在用户控件的 Load 事件中将它们设置为 true。没有任何区别。)

最佳答案

同样奇怪的问题也发生在 .NET 4.0 中。我注意到只有通过代码设置 IsEnabled 而不是绑定(bind)它时才会出现问题,因此如果您可以将代码更改为该代码,我相信您的问题会得到解决。

否则,我认为有必要采取一种解决方法,这是一种解决方法。第一次将 IsEnabled 设置为 True 时,为 UserControl 重置 DataContext。

public UserControl1()
{
    InitializeComponent();

    DependencyPropertyDescriptor descriptor =
        DependencyPropertyDescriptor.FromProperty(UserControl1.IsEnabledProperty, 
                                                  typeof(UserControl1));
    EventHandler isEnabledChanged = null;
    isEnabledChanged = new EventHandler(delegate
    {
        if (IsEnabled == true)
        {
            descriptor.RemoveValueChanged(this, isEnabledChanged);
            var dataContext = this.DataContext;
            this.DataContext = null;
            this.DataContext = dataContext;
        }
    });
    descriptor.AddValueChanged(this, isEnabledChanged);
}

关于WPF ToggleButton 绑定(bind) IsChecked 禁用时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4964012/

相关文章:

c# - MVVM + Reactive + WCF 回调

javascript - 自定义绑定(bind)无法从 Knockout 2.3 更新到 3.3

c# - 使用 WPF 数据绑定(bind)设计响应式 UI

java - Android 切换按钮自定义大小/填充/间距

android - 将 onClickListener 附加到 ToggleButton

c# - 绑定(bind)到子项属性

c# - C#中的异步图像处理

WPF - 在页面/窗口级别响应 ViewModel 更改的最佳方式

c# - 如何将 ObservableConcurrentDictionary 绑定(bind)到 WPF TreeView

JavaFX ToggleButton 不可见,但注册为 Children