Я видел, что этот вопрос спросил многочисленные времена и пробежался через мой код много раз. Но когда я присваиваюсь к моему 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
был определенно объект в поле списка. Никакая удача.
Это не вещь видимости, если объект находится на экране, это все еще не выделяется. Я должен реализовать своего рода функцию равенства? Я потратил впустую больше времени, чем можно было бы думать возможный на этом.
спасибо.
Возможно, это также связано с тем, что ItemContainerGenerators
генерируются в отдельном потоке... ( как минимум в TreeView)
Попробуйте вызвать UpdateLayout() перед тем, как задать свойство ItemContainerGenerators
.
Ничто не бросается в глаза так явно неправильно, но вы многое упустили. Я могу только предложить вам упростить ситуацию, пока вы не найдете проблему или не получите полный нерабочий пример, который вы можете опубликовать.
Пытались ли вы проверить хэш-код каждого объекта в источнике элементов против хэш-кода объекта, который вы пытаетесь установить? Запрос Linq вернет что-то другое.
В качестве пробной установки SelectedTube на Items[0].
.