我在Silverlight UI中遇到了一个相当普遍的情况,其中各种元素的可见性都绑定到ViewModel的某些属性上。例如,我可能有一个这样的控件:
<myapp:WarningView Visibility="{Binding IsInWarningState}" />
Run Code Online (Sandbox Code Playgroud)
如果警告状态为true,则我们想显示控件,否则,我们不希望显示控件。问题在于,在很多情况下,页面都会呈现并显示所有内容,包括WarningView控件,然后再过一秒钟将视图隐藏起来,看起来非常笨拙。
我认为正在发生的事情是View加载并向服务器进行了异步调用以获取数据,但是在此之前,没有DataContext,因此没有任何警告视图绑定到该对象,并使用默认值,并且默认值是显示控制。
视图实例化其自己的视图模型似乎是最干净的方法,或者至少这就是我现在正在做的事情。而且由于该调用是异步的,因此当您要显示某些内容但还没有实际数据要显示时,总会有一定的间隔。我可以想象制作一个具有更好默认值的模拟ViewModel,但这似乎需要大量工作来进行整个项目。
那么解决此问题的最佳方法是什么?
好吧,在我放弃这个问题很久之后,我自己偶然发现了答案:在绑定中,您可以指定FallbackValue和/或TargetNullValue,它们指定在无法获取要绑定的对象时使用的值,或者一片空白。我的问题是,视图加载并创建了ViewModel,并且在视图可见和绑定完成之间的瞬间,控件是可见的,然后绑定将它们折叠,这会导致闪烁。通过设置回退值,我可以确保控件已折叠,然后仅在绑定时打开,然后保持打开状态。没有闪烁。
| 归档时间: |
|
| 查看次数: |
781 次 |
| 最近记录: |