【问题标题】:WPF ToggleButton binding IsChecked when disabled禁用时 WPF ToggleButton 绑定 IsChecked
【发布时间】:2011-06-25 05:47:49
【问题描述】:

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

我有一个包含三个 ToggleButtons 的 UserControl,每个都有 IsChecked 绑定到 UserControl 本身的不同依赖项属性。其中两个默认为真,一个默认为假。

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

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

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

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

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

【问题讨论】:

    标签: wpf data-binding togglebutton ischecked


    【解决方案1】:

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

    否则,我认为需要一种解决方法,这是一种解决方法。第一次将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);
    }
    

    【讨论】:

    • 实际上我可能过于简单了—— IsEnabled 是数据绑定的,但不是直接在用户控件上,它在树上更高的元素上。但是这个 hack 在调整正确的 DataContext 之后确实奏效了(我总是将内部上下文放在第一个孩子身上,而不是放在 UserControl 本身上。否则它们会被外部覆盖,这会变得混乱。)
    【解决方案2】:

    我遇到了“有点”类似的情况,以下 SO 回复被证明更适合我的情况。它为我省去了很多麻烦,因此,以防万一查看此解决方案的人没有注意到它,我认为在这里对它的引用应该很有用。

    WPF ToggleButton incorrect render behavior

    干杯

    曼苏尔

    【讨论】:

      猜你喜欢
      • 2010-12-04
      • 2011-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多