5

私はコントロールを持っていComboBoxます:

<ComboBox x:Name="TraceComboBox"
          ItemsSource="{Binding SingleChannelList}" 
          SelectedItem="{Binding RelativeSource={RelativeSource  FindAncestor,
                         AncestorType={x:Type cc:LogicTriggerSimpleLevelControl}},
                         Path=SelectedTrace, Mode=TwoWay}">

を含む OuterControl のプロパティは次のとおりPropertyChangedCallbackです。SelectedTraceComboBox

private static void OnSelectedTraceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    OuterControl oc = d as OuterControl ;
    oc.UpdateSelectedTrace();
}

private void UpdateSelectedTrace()
{
    ViewModelType vm = DataContext as ViewModelType;
    if (vm != null)
    {
        if (vm.SingleChannelList != null)
        {
            SelectedTrace = vm.SingleChannelList[0];
        }
    }
}

私の論理では、次のことが起こるはずです。

ComboBox( )内の 3 番目のオブジェクトを選択するSingleChannelList[2]と、変更ハンドラーが発生します。その後、UpdateSelectedTrace()ルーチンに入ります。この時点で、 の値SelectedTraceはもちろんSingleChannelList[2]です。ここで、ルーチンはプロパティをリスト ( ) の最初のオブジェクトにUpdateSelectedTrace()強制的に設定し、最初のオブジェクト内にネストされた別の変更ハンドラーを起動します。 "SelectedTrace" は SingleChannelList[0] と等しくなったため、ComboBox にも SingleChannelList[0] が選択として表示されるはずです。SelectedTraceSingleChannelList[0]

これはすべて、太字の最後の文までデバッガーを使用すると発生します。代わりに、次のように再生されます。

SelectedTraceは に等しくなりSingleChannelList[0]ましたが、は選択されたアイテムとしてComboBox表示SingleChannelList[2]されます。を試しUpdatingTargetてみましたがBindingExpressionSelectedTraceプロパティは値SingleChannelList[0]を保持し、 はComboBox引き続き表示されSingleChannelList[2]ます。これらのバインディングは安全でテスト済みであり、私がこれを試みるまでは常に機能していました。これが正しく機能しない理由を誰か教えてもらえますか?

ありがとうございました

4

2 に答える 2

2

これは、依存関係プロパティの「値の強制」のシナリオのように思えます。値の強制は、プロパティの値を目的の値に基づいて有効な値に「プッシュ」します。詳細については、こちらをご覧ください。

依存関係プロパティのコールバックと検証

于 2010-01-13T15:48:56.787 に答える