У меня проблема с парой полей со списком в 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()
.
Eg.
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 и заменен Синим. Это происходит правильно, НО отображаемое значение меняется с Зеленого на Синего.
Базовое связанное значение не изменяется, и ICollectionView.CurrentItem является правильным, но на дисплее явно отображается неправильное значение.
Я думаю, что происходит то, что, поскольку зеленый находится раньше в списке, он путается с тем, что показывается. Это также происходит, если вы сортируете ICollectionView.
Я попытался повторно поднять уведомление об изменении свойства для меняющегося поля со списком и выбранного элемента, но это, похоже, не работает.
Кто-нибудь видел эту проблему раньше или какие-либо идеи, как я могу это исправить?