5

低速のデータ ソースがあるため、非同期で作成します。また、ビューモデルの多くのプロパティ自体が遅いです。したがって、それらも非同期にします (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 がハングするという事実によって証明されています。

Q:ここで何が欠けていますか? IsAsync非同期プロパティでは十分ではありませんか?

編集:これは通常のTextBlock. 動作はIsAsyncコントロールの実装に依存していますか? (この場合、プロパティ グリッドのバグが疑われます。)

4

1 に答える 1

5

を常に使用することをお勧めしIsAsync BindingますPriorityBinding。GUI はプロパティが実行されるまで待機します。ただしPriorityBinding、最初のBindingプロパティがであるかどうかを確認し、そうであれば、次のプレースホルダーバインディングslowを選択します(高速である必要があります)。しかし、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複数のバインディングを指定する代わりに、いくつかを設定するだけです。

于 2012-10-29T12:48:50.380 に答える