2017-01-15 6 views
1

Weird ситуация, у меня есть следующий код XAML:WPF ListBox, то SelectedIndex не выделенная строка

<StackPanel> 
    <TextBlock>Logging here...</TextBlock> 
    <ListBox x:Name="LoggingListBox" ItemsSource="{Binding Log}" /> 
</StackPanel> 

Мой источник находится всего в 5 строк текста в ObservableCollection<string>, и я выбираю 4-ю строку:

LoggingListBox.SelectedIndex = 3; 

Но он показывает следующее:

Weird...

Как вы можете видеть, у 3-го элемента есть граница, но почему первая строка выделена?

Кто-нибудь понял, что происходит?


Update 1/17/17: Я сделал меньшую демо-версию этой проблемы.

1) Новый проект WPF

2) MainWindow.xaml:

<Window x:Class="ListBoxSelectionTest.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow"> 
    <StackPanel> 
     <TextBlock>Logging here...</TextBlock> 
     <ListBox x:Name="LoggingListBox" ItemsSource="{Binding Log}" /> 
    </StackPanel> 
</Window> 

3) Код позади:

public partial class MainWindow 
{ 
    public ObservableCollection<string> Log { get; set; } 

    public MainWindow() 
    { 
     InitializeComponent(); 
     DataContext = this; 

     Log = new ObservableCollection<string>(); 
     Log.CollectionChanged += (o, e) => LoggingListBox.SelectedItem = Log.Last(); 

     Log.Add("Adding instrument: Unknown:#22"); 
     Log.Add("Adding instrument: Unknown:#22"); 
     Log.Add("Adding instrument: Unknown:#22"); 
     Log.Add("Adding instrument: Unknown:#22"); 
     Log.Add("Adding instrument: Unknown:#22"); 
    } 
} 

4: Запуск программы: Похоже это на старте:

Wrong selection example #1

5: Нажмите кнопку TAB (фокус устанавливается ListBox), и теперь выглядит следующим образом:

Wrong selection example #2

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

+0

Странно, если это единственный код, который находится в игре, все должно работать. Какой метод «SelectionMode» вы используете? Вы делаете что-нибудь еще с выбором, кроме установки SelectedIndex? Где вы называете изменение выбранного индекса (т. Е. Обработчик нажатия кнопки)? – icebat

ответ

-2

Похоже, что ваш товар выбран, но не подсвечен. Вы можете попытаться выделить синим цветом при фокусировке.

<SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Cyan"/> 

и серый, когда не сосредоточен.

<SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Gray" /> 
-2

The ListBox предназначен для обработки множественного выбора и Блики отдельной ситуации. Вам также необходимо, чтобы прокрутить его в поле зрения, чтобы изменить курсор на выбранный таким

LoggingListBox.ScrollIntoView(LoggingListBox.Items[3]); 
0

После ваших правок это более ясно, что происходит в вашем случае.

Во-первых, обратите внимание, что делает это небольшое изменение тест на вашем примере устраняет проблему:

Log.Add("Adding instrument: Unknown:#22"); 
Log.Add("Adding instrument: Unknown:#23"); 
Log.Add("Adding instrument: Unknown:#24"); 
Log.Add("Adding instrument: Unknown:#25"); 
Log.Add("Adding instrument: Unknown:#26"); 

Каждая строка отличается в настоящее время. Поэтому причина, по которой первая строка является серой \ синей, заключается в том, что ListBox не может отличить их в основном.

Но почему у нас есть пунктирная граница?Ну, это потому, что он нарисован другим механизмом - FocusVisualStyle. И, похоже, он правильно отслеживает выбранный визуальный элемент.

Существуют различные возможные решения ситуации, но почему бы просто не переместить логику выбора в индексы и не сделать с ней?

LoggingListBox.Loaded += (o, e) => 
    { 
     Log.CollectionChanged += (oo, ee) => SelectLastEntry(); 
     SelectLastEntry(); 
    }; 

... 

private void SelectLastEntry() 
{ 
    LoggingListBox.SelectedIndex = LoggingListBox.Items.Count - 1; 
} 
Смежные вопросы