ListBox TwoWay связывает с SelectedItem

Я видел, что этот вопрос спросил многочисленные времена и пробежался через мой код много раз. Но когда я присваиваюсь к моему SelectedItem- связанное свойство с объектом, это не обновляет выбранный пункт дисплея. Кажется что ListBox думает объект, который я присваиваю, не член его объектов.

public class MainViewModel : ViewModelBase
{
    //...
    public SortedObservableCollection Items { get; private set; }
    public TubeViewModel SelectedTube { //get, set, propertychanged, etc. }
}



Вот impl от одного из мест, где я пытаюсь установить SelectedTube - определенно происходит на основном потоке.

 var match =
    from t in Items
    where t.Model.DataFileName == filename
    select t;
 if (match.Any())
    SelectedTube = match.First();

Я замечал что SelectedTube никогда не выделялся, если я вручную не нажал на него, но отчасти проигнорировал его. Но затем я хотел к ScrollIntoViewCentered выбранный пункт, таким образом, я добавил a DependencyProperty по моему мнению, наблюдать за SelectedItem изменения. Обработчик первоначально был похож так:

private void OnSelectedItemChanged(DependencyObject target, DependencyPropertyChangedEventArgs e)
{
    if (TubeList.SelectedItem == null)
       return;

    TubeList.ScrollIntoViewCentered(TubeList.SelectedItem);
}

Но не работал, если я установил SelectedItem посредством моей привязки. После решения я хотел только прокрутить его, если это не было на экране, я изменил код на это:

private void OnSelectedItemChanged(DependencyObject target, DependencyPropertyChangedEventArgs e)
{
    if (TubeList.SelectedItem == null)
       return;

    var container = TubeList.ItemContainerGenerator.ContainerFromItem(TubeList.SelectedItem) as FrameworkElement;

    if(!container.IsVisible)
       TubeList.ScrollIntoViewCentered(TubeList.SelectedItem);
}

Если SelectedItem внешне установлен, контейнер пустой. Каждый раз. Я даже добавил код, чтобы проверить на пустой указатель и затем выполнить итерации по ItemsSource при поиске соответствия имени файла затем обновите SelectedItem удостоверяться SelectedItem был определенно объект в поле списка. Никакая удача.

Это не вещь видимости, если объект находится на экране, это все еще не выделяется. Я должен реализовать своего рода функцию равенства? Я потратил впустую больше времени, чем можно было бы думать возможный на этом.

спасибо.

5
задан Vadim Kotov 8 August 2017 в 13:43
поделиться

3 ответа

Возможно, это также связано с тем, что ItemContainerGenerators генерируются в отдельном потоке... ( как минимум в TreeView)

Попробуйте вызвать UpdateLayout() перед тем, как задать свойство ItemContainerGenerators.

5
ответ дан 14 December 2019 в 01:09
поделиться

Ничто не бросается в глаза так явно неправильно, но вы многое упустили. Я могу только предложить вам упростить ситуацию, пока вы не найдете проблему или не получите полный нерабочий пример, который вы можете опубликовать.

3
ответ дан 14 December 2019 в 01:09
поделиться

Пытались ли вы проверить хэш-код каждого объекта в источнике элементов против хэш-кода объекта, который вы пытаетесь установить? Запрос Linq вернет что-то другое.

В качестве пробной установки SelectedTube на Items[0].

.
1
ответ дан 14 December 2019 в 01:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: