У меня есть некоторая проблема с привязкой данных WPF, и я надеюсь, что объяснение будет ясным, потому что я боюсь, что проблема очень тонкая.
По сути, у меня WPC UserControl с кучей ComboBox, каждыйприкован друг к другу.Я имею в виду, что первый комбинированный список заполнен некоторыми элементами, а когда пользователь выбирает элемент, второй комбинированный список заполняется элементами, основанными на предыдущем выборе, и так далее с другим комбинированным списком.Все поля со списком связаны с UpdateSourceTrigger = LostFocus.
Код для свойства ItemsSource комбо выглядит так:
private ICollectionView allTicketTypesView;
public IEnumerable<TicketTypeBase> AllTicketTypes
{
get { return this.allTicketTypesView.SourceCollection.Cast<TicketTypeBase>(); }
private set
{
IEnumerable<TicketTypeBase> enumerable = value ?? new TicketTypeBase[0];
ObservableCollection<TicketTypeBase> source = new ObservableCollection<TicketTypeBase>(enumerable);
this.allTicketTypesView = CollectionViewSource.GetDefaultView(source);
this.OnPropertyChanged("AllTicketTypes");
}
}
Код для свойства SelectedItem комбо похож на этоткод:
private TicketTypeBase ticketType;
public TicketTypeBase TicketType
{
get { return this.ticketType; }
set
{
this.ticketType = value;
this.OnPropertyChanged("TicketType");
this.UpdateConcessions();
}
}
У меня возникла небольшая проблема: когда я перемещаюсь с клавиатурой и / или мышью над комбо, я вижу, что часто измененный свойство вызывается также, когда я фактически не изменяюпункты списка.Я имею в виду, что комбо заполнено элементами, и выбран элемент: перемещение по комбо с помощью клавиатуры вызывает изменение свойства (и позволяет обновлять другое комбо, что является непопулярным поведением), но сам элемент такой же,Я вижу это поведение в выпадающем списке, который связан со списком строк (поэтому я полагаю, что при реализации Equals / GetHashCode ошибки не возникает), и такое поведение происходит каждый раз, кроме первого раза.
Я исправил код с помощьюэто:
private string category;
public string Category
{
get { return this.category; }
set
{
bool actuallyChanged = !String.Equals(this.category, value);
this.category = value;
this.OnPropertyChanged("Category");
if (!actuallyChanged)
{
string format = String.Format("Category '{0}' isn't changed actually", value);
Trace.WriteLine(format);
}
else this.UpdateTicketTypes():
}
}
Но, конечно, мне не нравится этот код, который добавляет логику в сеттеры.
Есть какие-нибудь предложения о том, как избежать такого поведения?Я надеюсь быть ясным, и я готов лучше объяснить мою проблему, если кто-то не понимает ясно.