WPF ToggleButton禁用时绑定IsChecked属性

3
这是一个有点奇怪的问题(.NET 3.5sp1)。
我有一个UserControl,其中包含三个ToggleButton,每个ToggleButton的IsChecked属性都绑定到UserControl本身的不同依赖属性上。其中两个默认为true,一个默认为false。
在应用程序启动时,UserControl本身(及其内容)被禁用。当稍后它被启用时,所有三个按钮都没有按下;但代码属性仍处于正确状态。
如果点击这些按钮,则属性将正确地切换,并且UI(仅针对该按钮)将更新以反映正确状态(即单击一个看起来未按下但具有真实绑定值的按钮将在第一次时不会显示任何可见变化,但更新为绑定值为false)。 第二次按下“故障”按钮将正常运作(如果它打开,按钮将按预期压缩)。
如果在启动时未禁用UserControl,则按钮将根据属性的状态正确显示。
不幸的是,UserControl应该在启动时禁用,因此我无法以启用状态启动;我希望有替代方案。 有任何想法吗?
(我尝试将属性默认设置为false,然后在用户控件的Load事件中将它们设置为true。没有任何区别。)
2个回答

2
在.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 后(我总是将内部 Context 放在第一个子元素上,而不是在 UserControl 本身上。否则,它们可能会被外部覆盖,这会变得混乱)。 - Miral

0

我遇到了一个“有点”类似的情况,以下的SO回复在我的情况下更为适用。它帮我省去了很多麻烦,所以,万一看到这个解决方案的任何人没有注意到它,我认为在这里提供一个参考会很有用。

WPF ToggleButton incorrect render behavior

祝好

Mansoor


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