У меня проблема с парой полей со списком в Silverlight 4.0.
Намерение состоит в том, чтобы иметь два разных комбинированных списка, которые читают из одного и того же списка, но если какой-либо элемент, выбранный в одном, не будет отображаться в другом (поскольку базовые свойства не могут быть одинаковыми).
например. (это просто пример кода, но идентично представляет, как он работает)
<ComboBox ItemsSource="{Binding BackgroundColors}"
SelectedItem="{Binding SelectedBackgroundColor, Mode=TwoWay}" />
<ComboBox ItemsSource="{Binding ForegroundColors}"
SelectedItem="{Binding SelectedForegroundColor, Mode=TwoWay}" />
Чтобы разрешить эту динамическую фильтрацию, у меня есть 2 разных ICollectionView
в моей ViewModel, с которыми связано каждое комбинированное окно ItemsSource
. Каждый ICollectionView
имеет источник того же ObservableCollection<T>
, но в фильтре настроен отфильтровывать выбранный элемент другого.
private ObservableCollection<Color> _masterColorList;
public ICollectionView BackgroundColors { get; }
public ICollectionView ForegroundColors { get; }
Когда SelectedItem изменяется в пользовательском интерфейсе, свойства 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
Если я затем выберу Red в CB1, я ожидаю, что Red будет удален из CB2 и Blue заменит его. Это происходит правильно, НО отображаемое значение изменяется с Зеленый на Синий .
Базовое граничное значение не изменяется, и ICollectionView.CurrentItem является правильным, но на дисплее явно отображается неправильное значение.
Я думаю, что происходит потому, что Грин раньше в списке, что она путается с тем, что показывают. Это также происходит, если вы сортируете ICollectionView.
Я попытался повторно поднять уведомление о событии измененного свойства для изменяющегося списка и выбранного элемента, но, похоже, это не сработало.
Кто-нибудь видел эту проблему раньше или какие-либо идеи, как я мог это исправить?