#wpf #xaml
#wpf #xaml
Вопрос:
У меня возникли некоторые проблемы с ListBox
привязкой данных и неизменяемостью. У меня есть модель, которая предоставляет List
некоторые элементы, и ViewModel, которая принимает эти элементы и помещает их в an ObservableCollection
, который привязан к ListBox
.
Однако элементы не изменяются, поэтому при их изменении — что происходит, когда пользователь изменяет ListBox
выбор или в нескольких других сценариях — модель запускает событие, а ViewModel извлекает новые List
экземпляры new elements и повторно ObservableCollection
заполняет .
Этот подход работает довольно хорошо — несмотря на то, что он явно не оптимален — когда пользователь взаимодействует с ListBox
помощью мыши (щелчок), но ужасно терпит неудачу при использовании клавиатуры (вкладка для фокусировки текущего элемента, а затем с помощью стрелок мыши или дальнейших вкладок). По какой-то причине ActiveSchema
всегда выполняется сброс к первому элементу Schemas
[*] .
ActiveSchema
Сеттер вызывается для схемы, на которую переключился пользователь, затем для null и, наконец, снова для первого значения. По какой-то причине два последних события не происходят при вызове с помощью мыши.
PS: полный код можно найти здесь
PPS: Я знаю, что мне, вероятно, следует переработать модель, чтобы она показывала ObservableCollection
, что она видоизменяется, но есть причины, по которым уничтожение всего и создание его с нуля просто немного надежнее.
//ListBox's Items source is bound to:
public ObservableCollection<IPowerSchema> Schemas { get; private set; }
//ListBox's Selected item is bound to:
public IPowerSchema ActiveSchema
{
get { return Schemas.FirstOrDefault(sch => sch.IsActive); }
set { if (value != null) { pwrManager.SetPowerSchema(value); } }
}
//When model changes:
private void Model_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
if(e.PropertyName == nameof(IPowerManager.PowerSchemas))
{
updateCurrentSchemas();
}
}
private void updateCurrentSchemas()
{
Schemas.Clear();
var currSchemas = pwrManager.PowerSchemas;
currSchemas.ForEach(sch => Schemas.Add(sch));
RaisePropertyChangedEvent(nameof(ActiveSchema));
}
Комментарии:
1. Ну, для «По какой-то причине ActiveSchema всегда сбрасывается до первого элемента схем [*]». В getter вы получаете первый (активный) элемент нового списка. Возможно, вам нужно это изменить,