2012-10-29 18 views
5

我有一个缓慢的数据源,所以我创建它异步。而且,我的viewmodel的很多属性本身都很慢。因此,我让他们太异步(绑定到一个Telerik的属性网格):“IsAsync”对缓慢的属性没有影响?

<Grid> 
    <Grid.DataContext> 
    <ObjectDataProvider ObjectType="{x:Type viewModels:MyViewModel}" 
     IsAsynchronous="True" x:Name="myViewModel" /> 
    </Grid.DataContext> 
    <telerik:RadPropertyGrid x:Name="settings" Item="{Binding IsAsync=True}"> 
    <telerik:RadPropertyGrid.PropertyDefinitions> 
     <telerik:PropertyDefinition 
     Binding="{Binding Path=SlowProperty,IsAsync=True,Mode=TwoWay}" /> 
    </telerik:RadPropertyGrid.PropertyDefinitions> 
    </telerik:RadPropertyGrid> 
</Grid> 

调试时,我可以看到数据源是在另一个线程创建的确,因此不会阻塞UI。但是,当我进入SlowProperty时,调试器显示我仍然处于主线程中 - 事实证明,UI一直挂起,直到属性返回。

问:我在这里错过了什么?对于异步属性,不是IsAsync足够吗?

编辑:看来这适用于正常的TextBlockIsAsync行为是否依赖于控件的实现? (在这种情况下,我怀疑属性网格中存在一个错误。)

回答

5

您总是不愿意使用IsAsyncBindingPriorityBinding。 GUI会一直等到属性被执行。但随着PriorityBinding它会检查第一Binding属性为slow,如果是的话,它会选择下一个占位符结合(应该是快)。但是,当评估缓慢的属性时,它将成为绑定的活动值。

<TextBlock> 
<TextBlock.Text> 
    <PriorityBinding FallbackValue="defaultvalue"> 
    <Binding Path="SlowestProp" IsAsync="True"/> 
    <Binding Path="SlowerProp" IsAsync="True"/> 
    <Binding Path="SurelyFastProp" /> 
    </PriorityBinding> 
</TextBlock.Text> 
</TextBlock>  

在你的情况,你可以简单地设置一些defaultValue而不是给多个绑定。

+1

你是说'PriorityBinding'对异步绑定至关重要吗? – l33t