Silverlight 4.0 のコンボ ボックスのペアに問題があります。
意図は、同じリストから読み取る 2 つの異なるコンボボックスを持つことですが、一方で選択されたアイテムが他方に表示されない場合 (基本的なプロパティが同じであることは許可されていないため)。
例 (これは単なるサンプル コードですが、同じように動作することを表しています)
<ComboBox ItemsSource="{Binding BackgroundColors}"
SelectedItem="{Binding SelectedBackgroundColor, Mode=TwoWay}" />
<ComboBox ItemsSource="{Binding ForegroundColors}"
SelectedItem="{Binding SelectedForegroundColor, Mode=TwoWay}" />
この動的フィルタリングを可能にするためにICollectionView
、各コンボ ボックスがバインドされている ViewModel に 2 つの異なる がありますItemsSource
。それぞれICollectionView
に同じソースがありObservableCollection<T>
ますが、フィルターでは、他の選択されたアイテムを除外するように設定されています。
private ObservableCollection<Color> _masterColorList;
public ICollectionView BackgroundColors { get; }
public ICollectionView ForegroundColors { get; }
SelectedItem が UI で変更されると、ViewModel プロパティが更新され、その一部として、反対のICollectionView
ものが を介して更新され.Refresh()
ます。
例えば。
public Color SelectedForegroundColor
{
get { return _selectedForegroundColor; }
set
{
if (_selectedForegroundColor == value)
return;
_selectedForegroundColor = value;
BackgroundColors.Refresh();
RaisePropertyChanged(() => SelectedForegroundColor);
}
}
これにより、フィルターを再実行して、選択できるものを変更できます。
これはかなりうまく機能しますが、問題があります:
マスター リストに 3 つの色があるとします。
- 青い
- 緑
- 赤
コンボボックス 1 (CB1) は青を選択 コンボボックス 2 (CB2) は緑を選択
したがって、コンボボックスにはこれらのリストがあります(太字が選択されています)
CB1
- 青い
- 赤
CB2
- 緑
- 赤
次にCB1 で赤を選択すると、赤が CB2 から削除され、青がそれを置き換えると予想されます。これは正しく行われますが、表示される値がGreenからBlueに変わります。
基になるバインドされた値は変更されず、ICollectionView.CurrentItem は正しいですが、ディスプレイには明らかに間違った値が表示されています。
私が考えているのは、緑がリストの前にあるため、表示されているものと混同されているということです. ICollectionView を並べ替えている場合にも発生します。
変更中のコンボボックスと選択したアイテムのプロパティ変更イベント通知を再発生させようとしましたが、うまくいかないようです。
誰かがこの問題を以前に見たことがありますか、またはそれを修正する方法はありますか?