l33*_*33t 5 wpf asynchronous mvvm 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>
Run Code Online (Sandbox Code Playgroud)
在调试时,我可以看到数据源确实在另一个线程中创建,因此不会阻止UI.但是,当我进入SlowProperty调试器时,我发现我仍然在主线程中 - 这可以通过UI挂起直到属性返回来证明.
问:我在这里错过了什么?IsAsync异步属性是不够的?
编辑:这似乎适用于正常情况TextBlock.IsAsync行为是否依赖于控件的实现?(在这种情况下,我怀疑属性网格中存在错误.)
你总是ecouraged使用IsAsync Binding带PriorityBinding.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>
Run Code Online (Sandbox Code Playgroud)
在您的情况下,您可以简单地设置一些defaultValue而不是给出多个绑定.