“IsAsync”对缓慢的财产没有影响?

时间:2012-10-29 12:38:25

标签: wpf mvvm asynchronous viewmodel

我的数据源很慢,所以我是异步创建的。此外,我的viewmodel的许多属性本身都很慢。因此,我也使它们异步(绑定到Telerik属性网格):

<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行为是否依赖于控件的实现? (在这种情况下,我怀疑属性网格中存在错误。)

1 个答案:

答案 0 :(得分:5)

您始终希望IsAsync BindingPriorityBinding一起使用。 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,而不是提供多个绑定。