2011-11-11 10 views
0

私はDeveloper Expressコンポーネント(http://www.devexpress.com/Support/Center/p/Q352950.aspxの問題)に最初に気づいた奇妙なWPF問題があります。ComboBox.ItemsSourceとSelectedItemの両方をデータバインディングすると、SelectedItemの設定が早すぎる

ComboboxesはSelectedItemをあまりにも早くdatabindしているようですが、私はそれについて何をすべきか分かりません。 (わかりやすくするためにいくつかの変更で)開発者急行問題から

コピー:

I私のXAMLで、次のcomboboxeditあります

<dxe:ComboBoxEdit Name="CharacteristicDropdown" ItemsSource="{Binding Path=Characteristics}" SelectedItem="{Binding Path=StratifyCharacteristic}" ValueMember="CharacteristicName" DisplayMember="CharacteristicName" /> 

(注 - 同じ問題が明らかに存在し、正常にComboBox、私はちょうどここにコードを保持した)

私の問題は、SelectedItemが私が期待するよりはるかに早く設定されているということです。 ItemsSourceが変更されると、その中の最初の項目がSelectedItemになります。これは非常に不合理です。リストに入っているからといって選択されていません。さらに、実際には視覚的にがコンボボックスで選択されていません。 ItemsSourceを変更するときだけでなく、実際にアイテムを選択するときに、コードまたはUIのやりとりを介してSelectedItemを設定したいとします。

ちょうど完全に透明であることが、このイベントの連鎖である。)

1 Iアイテム

2のするBindingListにグリッドデータバインドを持っている)私は同じするBindingListにコンボボックスdatabountを有しますグリッド

3)グリッドを使ってこのリストに何かを追加します。 )

4を(これはしかし、これは問題ではありません。、アイテムが完全にグリッドで記入されていても前に解雇された)コンボボックスのSelectedItemのは自動的設定されています!これは、単にコンボボックスのバッキングリストに項目があるために発生します。

実際には何も選択していないことに注意してください。バッキングリストに追加しました。 しかし、バッキングリストに単純に追加するだけで、アイテムが選択されていなくても、SelectedItemが表示されるようになりました。さらに、私が今ドロップダウンからアイテムを選択しようとすると、SelectedItemは再び設定されません!

これは私を夢中にしています - 誰にも解決策がありますか?

+0

解決策はありませんが、私は「非論理的」な部分に答えたいと思います。それは論理以上のものです。空のコレクションがあるのに、選択したアイテムを何かに設定した場合、ComboBoxをコレクションに追加するまで、ComboBoxはこのアイテムを保持していますか?そのようには機能しません。この問題を回避するには、CollectionViewとSynchronizeWithCurrentItemを使用するか、SelectedIndexを使用する方法が2つあります。 – dowhilefor

+0

ありがとう、私はCollectionViewとSynchronizeWithCurrentItemを見ていきますが、私はあなたが私を誤解しているかもしれないと思います。 *私はSelectedItemを設定していません。 * ComboBox *は、バッキングリストがアイテムを取得するときにこれを単独で行います。私はそれを直接設定することはありません - 私はそれが設定されているものを読み取るために必要です。さらに、ひとつの項目がリストに追加されると(それはやはり私が非合理的であると感じる)選択されるべきであるという望ましいセマンティクスであっても、この項目がUIで選択されていないことは依然として非常に矛盾している! – Fafnr

+0

ああ、私の悪い。わかりました。次に、あなたが正しいです、それはアイテムが選択されていることは奇妙ですが、コンボボックスは選択されているとして表示されません。もちろん、それは直接奇妙であることを選択します。私はそれを再現し、私が何を思いつくのかを見てみよう。 – dowhilefor

答えて

3

グリッドにアイテムを追加すると、コンボボックスのアイテムソースがバインドされているプロパティが更新され、コンボボックスはソースが変更されてからコレクションの最初のアイテムが選択される。 DataGridのxamlコードを見て、そのバインディングを確認すると便利です。

提案のカップル:

1)の代わりにバインディングリストのように似てIEnumerableコレクションを使用してみてください:

private ObservableCollection<Drink> drinks = new ObservableCollection<Drink>(); 

public IEnumerable<Drink> DrinkCollection 
    { 
     get { return this.drinks; } 
    } 

とプロパティにコンボをバインドします。

2)xamlのUpdateSourceTriggerプロパティとSynchronizeWithCurrentItemプロパティで遊んでみましょう。

3)あなたのコンボ用に別のプロパティを作成します。

0

私はあなたがICollectionView使用に切り替えることを示唆している:あなたがtrueにIsSynchronizedWithCurrentItemを新しいプロパティを指すと設定する結合

public ViewModel() 
{ 
    this.CharacteristicsView = CollectionViewSource.GetDefaultView(this.Characteristics); 
} 

public ICollectionView CharacteristicsView { get; private set; } 

変更:

を1新しいであなたのパブリックプロパティを置き換えます。

<ComboBox ItemsSource="{Binding Path=CharacteristicsView}" 
     IsSynchronizedWithCurrentItem="True" ValueMember="CharacteristicName" 
     DisplayMember="CharacteristicName" /> 

ビューのCurrentItemプロパティを使用し、現在の項目にアクセスする必要がどこ:

var currentItem = this.CharacteristicsView.CurrentItem; 
関連する問題