如何在将布尔值绑定到控件的可见性时防止闪烁

时间:2012-06-27 15:03:42

标签: c# windows-phone-7 xaml data-binding windows-phone

我的ViewModel中有一个布尔属性,名为IsNotSupported,用于在不支持传感器时显示一些警告信息。因此,我使用了BooleanToVisibilityConverter,它添加在资源中:

<phone:PhoneApplicationPage.Resources>
    <local:BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
</phone:PhoneApplicationPage.Resources>

并将其绑定到包含警告的堆栈面:

<StackPanel x:Name="NotSupportedWarning" Visibility="{Binding IsNotSupported,
                    Converter={StaticResource BooleanToVisibilityConverter}}">

这一切都很顺利,但是当加载页面并且支持传感器时,警告只会出现几分之一秒,然后消失。我知道这种闪烁是由于尚未发生的绑定造成的,因此默认为可见。

闪烁它是令人讨厌的地狱......它应该默认崩溃并且只有在显然应该显示警告后才能看到它。此外,这将避免绑定后的第二次布局过程,因此可能会产生积极的性能影响。


我一遍又一遍地遇到这个问题,直到我找到this这个问题时才发现这个问题,这是密切相关的,但如果搜索的是Windows手机而不是银光,则找不到。问题和解决方案看起来都很简单,但我确实在很长一段时间内对我提出了异议,所以我认为写一个关于它的Q&A-style问题来帮助其他面临同样问题的人可能是个好主意。功能

2 个答案:

答案 0 :(得分:5)

看完它后解决方案很简单。您可以使用FallbackValue控制绑定的默认值(如果绑定尚未发生)。您的stackpanel XAML看起来像:

<StackPanel x:Name="NotSupportedWarning" Visibility="{Binding IsNotSupported,
                    FallbackValue=Collapsed, 
                    Converter={StaticResource BooleanToVisibilityConverter}}">

这样你就可以摆脱闪烁,如果警告保持隐藏状态,它就不必在绑定后进行转发。

答案 1 :(得分:1)

您可以直接绑定到Visibility属性类型而不是boolean并保持该属性在默认情况下折叠,并且您可以实现INotifyPropertyChanged