1

これをできるだけ簡潔に説明しようと思います。2 つのオブジェクトがあります。1 つ目は Id プロパティを持つオブジェクト A と呼び、2 つ目は ParentId プロパティを持つオブジェクト B と呼びます。明らかな関係は、オブジェクト B の ParentId がオブジェクト A の Id プロパティに設定されていることです。私は MVVM パターンを使用しているので、viewmodel には 2 つの ObservableCollections があり、1 つはオブジェクト A と他のオブジェクト B を含みます。viewmodel の構築時に、ListItems という名前の ObservableCollection<'A'> を作成して入力します。私のxamlはシンプルです、

<StackPanel>
    <ListBox IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding ListItems}">
    </ListBox>

    <ComboBox SelectedValuePath="ParentId" SelectedValue="{Binding Path=ListItems/Id, Mode=OneWay}" ItemsSource="{Binding ComboItems}">
    </ComboBox>

    <Button Click="Button_Click" Content="Push Me"/>            
</StackPanel>

ご覧のとおり、コンボボックスの SelectedValue は ListItems の現在のアイテムの Id プロパティにバインドされています。したがって、基本的にリストボックスとコンボボックスはマスター詳細にあります。

ボタンを押すと、ObservableCollection<'B'> という名前の ComboItems が入力され、コンボボックスに入力されます。ここから奇妙さが始まります。プログラムを起動すると、ボタンを押すだけで、あとでリストボックス内の項目を選択すると、SelectedValue バインディングにより、コンボボックスが適切に項目を選択します。しかし、プログラムを起動して最初にリストボックス内の項目を選択してからボタンを押すと、現在のコンボボックス項目は現在のリストボックス項目で変更されません。バインディングは永久に壊れているようです。なぜこれが起こるのか誰か知っていますか?

Ps。SelectedValue/SelectedValuePath を設定する前にコンボボックスに ItemsSource を設定すると、マスター/詳細バインディングは機能しません。xamlには順序があることは知っていますが、それは少し壊れやすいようです。誰かがそれについても意見を持っているなら、私はすべて耳を傾けています。

ありがとう、ネイト

編集 -

SelectedValue をバインドする場合、非常に脆弱です。バインドが機能している場合、つまり、リスト ボックスで何も選択せずにコンボ ボックスを埋めた場合、コンボ ボックスでアイテムを選択すると、バインドが壊れます。これで多くの時間を無駄にした後、SelectedItem をバインドすることにしました。このバインディングは、以前に指定したどの条件でも壊れません。ただし、 SelectedValue バインディングが非常にばかげている理由については、どんな回答でも構いません。回答した、または回答する予定のすべての人にもう一度感謝します。

4

1 に答える 1

2

ええ、これは私たちがよく遭遇する問題です。

問題は、ItemsSourceプロパティが新しい値を取得した後、SelectedValueバインディングがクリアされることです。ひどい、そして今日まで適切な解決策が見つかりませんでした。

いくつかの回避策を次に示します。

  • SelectedValue新しい ItemsSource が設定されるとすぐに、コードでバインディングをリセットします。これは、コンバーターで行うか、ItemsSource バインディング (DataContextChangedイベントなど) を置き換えることがわかっている場所で行うことができます。

  • Bindingonを使用する代わりに、 aと FilterItemsSourceを使用してみてください。CollectionViewSourceすべてのアイテムをCollectionViewSourceオブジェクトに入れ、コンボボックスの値が変更されたときにアイテムをフィルタリングします。

  • SelectionChangedリストボックスがイベントをスローしたときに、昔ながらの方法でアイテムを手動で取得します。

すべてのソリューションが本の中で最も美しいわけではないことに注意してください。私はオプション2を選びます。これは最もクリーンなIMOです;)

お役に立てれば!

于 2010-01-12T16:07:46.363 に答える