Привязка и неизменность данных ListBox

#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 вы получаете первый (активный) элемент нового списка. Возможно, вам нужно это изменить,