如何防止Silverlight视图中的闪烁?

如何防止Silverlight视图中的闪烁?,silverlight,mvvm,Silverlight,Mvvm,在我的Silverlight UI中有一种相当常见的情况,即各种元素的可见性绑定到ViewModel上的某个属性。例如,我可能有这样一个控件: <myapp:WarningView Visibility="{Binding IsInWarningState}" /> 如果警告状态为true,我们希望显示控件,如果不是,则不显示。问题是,在很多情况下,页面呈现并显示所有内容,包括WarningView控件,然后一秒钟后隐藏视图,这看起来非常笨拙 我认为现在的情况是视图加载并向服务

在我的Silverlight UI中有一种相当常见的情况,即各种元素的可见性绑定到ViewModel上的某个属性。例如,我可能有这样一个控件:

<myapp:WarningView Visibility="{Binding IsInWarningState}" />

如果警告状态为true,我们希望显示控件,如果不是,则不显示。问题是,在很多情况下,页面呈现并显示所有内容,包括WarningView控件,然后一秒钟后隐藏视图,这看起来非常笨拙

我认为现在的情况是视图加载并向服务器发出异步调用以获取数据,但在此之前,没有DataContext,因此WarningView无法绑定到任何内容,并使用默认值,默认值是显示控件

视图实例化自己的视图模型似乎是最干净的,或者至少这就是我现在正在做的。由于调用是异步的,所以当您想要显示某些内容但还没有真正的数据显示时,可能总会有一些时间间隔。我可以想象制作一个具有更好默认值的模拟ViewModel,但这似乎需要在整个项目范围内做很多工作


那么解决这个问题的最佳方法是什么呢?

好吧,在我放弃这个问题很久之后,我自己偶然发现了答案:在绑定中,您可以指定一个FallbackValue和/或TargetNullValue,它们指定当您绑定的对象无法获得或为null时要使用的值。我的问题是视图加载并创建ViewModel,在视图可见和绑定完成之间的一瞬间,控件可见,然后绑定将其折叠,这会导致闪烁。通过设置回退值,我可以确保控件已折叠,然后仅在绑定时打开,然后保持打开状态。无闪烁。

IsInWarningState在您的虚拟机中是否默认为true或false?false,这就是为什么控件应该隐藏的原因,它在虚拟机加载后隐藏,但在此之前它是可见的,这就是导致闪烁的原因。您为什么要等待虚拟机上的异步调用完成?请为IsInWarningState属性添加一些代码。如何将ViewModel附加到视图?+1非常感谢!我觉得我已经找了很多年了
FallbackValue
成功了。要是我早点知道就好了。为什么只有我在这件事上投了赞成票?不客气。我还以为这是人们会遇到的常见情况,但我想不会,因为这个问题没有太多的观点,也没有人回答。所以也许没有其他人遇到这个问题。很难相信,但确实如此。