禁用时WPF ToggleButton绑定IsChecked

时间:2011-02-10 23:40:53

标签: wpf data-binding togglebutton ischecked

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

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

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

如果单击按钮,则属性将正确切换,并且UI(仅适用于该按钮)将更新以反映正确的状态(即,单击未按下但具有真实边界值的按钮将显示第一次没有可见的更改,但将绑定值更新为false)。第二次按下“glitched”按钮将表现正常(如果它打开,按钮将按预期按下)。

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

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

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

2 个答案:

答案 0 :(得分:2)

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

否则,我相信一个解决方法是必要的,这是一种方法。第一次UserControl设置为IsEnabled时,重置True的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);
}

答案 1 :(得分:0)

我偶然发现了一个'在我的案例中,类似的情况和以下的SO回复证明更合适。它为我省去了很多麻烦,所以,如果有人看到这个解决方案并没有注意到它,我想在这里引用它应该是有用的。

WPF ToggleButton incorrect render behavior

干杯

曼索尔