2

ビューに 2 つの ComboBox があります。どちらもObservableCollectionsViewModel で 2 つの異なるものにバインドされており、ComboBox1 で選択された項目が変更されると、ComboBox2 が別のコレクションで更新されます。バインディングは問題なく機能しますが、2 番目の ComboBox で常にコレクション内の最初の項目を選択するようにします。最初は機能しますが、ComboBox2 のソースと項目が更新されると、選択インデックスが -1 に変更されます (つまり、最初の項目が選択されなくなります)。

これを修正するために、SourceUpdatedComboBox2 にイベントを追加し、イベントが呼び出すメソッドがインデックスを 0 に戻します。問題は、メソッドが呼び出されないことです (メソッドの一番上にブレークポイントを置いても、取得されません)。打つ)。これが私のXAMLコードです:

<Grid>
    <StackPanel DataContext="{StaticResource mainModel}" Orientation="Vertical">
        <ComboBox ItemsSource="{Binding Path=FieldList}" DisplayMemberPath="FieldName"
                  IsSynchronizedWithCurrentItem="True"/>

        <ComboBox Name="cmbSelector" Margin="0,10,0,0"
                  ItemsSource="{Binding Path=CurrentSelectorList, NotifyOnSourceUpdated=True}"
                  SourceUpdated="cmbSelector_SourceUpdated">
        </ComboBox>    
    </StackPanel>
</Grid>

コード ビハインドでは次のようになります。

// This never gets called
private void cmbSelector_SourceUpdated(object sender, DataTransferEventArgs e)
{
    if (cmbSelector.HasItems)
    {
        cmbSelector.SelectedIndex = 0;
    }
}

どんな助けでも大歓迎です。

4

1 に答える 1

4

1時間かけて、やっと理解できました。答えは、依存関係プロパティの変更をリッスンするという質問に基づいています。

DependencyPropertyしたがって、基本的に、オブジェクトの任意の「プロパティ変更」イベントを定義できます。これは、新しいタイプを作成せずにコントロールにイベントを拡張または追加する必要がある場合に非常に役立ちます。基本的な手順は次のとおりです。

DependencyPropertyDescriptor descriptor = 
   DependencyPropertyDescriptor.FromProperty(ComboBox.ItemsSourceProperty, typeof(ComboBox));

descriptor.AddValueChanged(myComboBox, (sender, e) => 
{ 
   myComboBox.SelectedIndex = 0;
});

これによりDependencyPropertyDescriptor、プロパティのオブジェクトが作成ComboBox.ItemsSourceされ、その記述子を使用して、そのタイプの任意のコントロールのイベントを登録できます。ItemsSourceこの場合、 のプロパティmyComboBoxが変更されるたびに、SelectedIndexプロパティは 0 に戻されます (つまり、リストの最初の項目が選択されます)。

于 2013-05-09T20:39:02.480 に答える