6

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

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

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

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

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

那闪烁真是烦人......它应该默认为折叠并且只有在清楚应该显示警告后才可见。此外,这将避免绑定后的第二次布局传递,因此可能会对性能产生积极影响。


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

4

2 回答 2

8

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

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

通过这种方式,您可以消除闪烁,并且如果警告仍然隐藏,则不必在绑定后重新布局。

于 2012-06-27T15:03:42.973 回答
1

您可以直接绑定到 Visibility 类型的属性而不是布尔值,并默认将该属性保持为折叠状态,此外您还可以实现 INotifyPropertyChanged

于 2012-07-04T09:33:42.403 回答