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

Phi*_*ier 5 c# data-binding xaml windows-phone-7 windows-phone

我的ViewModel中有一个布尔属性,名为boolean属性,IsNotSupported如果不支持传感器,则该属性用于显示一些警告信息。因此,我使用BooleanToVisibilityConverter,将其添加到资源中:

<phone:PhoneApplicationPage.Resources>
    <local:BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
</phone:PhoneApplicationPage.Resources>
Run Code Online (Sandbox Code Playgroud)

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

<StackPanel x:Name="NotSupportedWarning" Visibility="{Binding IsNotSupported,
                    Converter={StaticResource BooleanToVisibilityConverter}}">
Run Code Online (Sandbox Code Playgroud)

一切正常,但是在加载页面并支持传感器时,警告仅出现一秒钟,然后消失。我知道这种闪烁是由于绑定尚未发生而导致的,因此默认为可见。

那种闪烁令人讨厌,就像地狱一样。它应该默认为折叠,并且只有在明确显示了警告之后,才能使其可见。同样,这将避免在绑定之后进行第二次布局,因此可能会对性能产生积极影响。


我一遍又一遍地遇到了这个问题,直到我发现这个非常相关的问题,直到在互联网上一无所获,但如果搜索Windows Phone而不是Silverlight则找不到问题。问题和解决方案都看起来很简单,但是我确实困扰了我很长时间,所以我认为写一个关于此问题的问答式的问题来帮助其他面临相同问题的人可能是一个好主意。

Phi*_*ier 5

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

<StackPanel x:Name="NotSupportedWarning" Visibility="{Binding IsNotSupported,
                    FallbackValue=Collapsed, 
                    Converter={StaticResource BooleanToVisibilityConverter}}">
Run Code Online (Sandbox Code Playgroud)

这样,您就可以摆脱闪烁,并且如果警告保持隐藏状态,则不必在绑定后将其重新发出。