Вопрос

У меня есть ListView привязка к ItemsSource.Почему это происходит SelectionChanged запуск события при загрузке / привязке к базе данных?Я предполагаю, что это потому, что выбраны элементы "по умолчанию", т.е. индекс 0.

Как я могу отключить это, потому что при выборе элемента обновляются данные из других источников.

Спасибо Petrus

Это было полезно?

Решение 2

спасибо за ответы.

Когда я ставлю точку останова на событие SelectionChanged, оно прерывает работу там до того, как экран будет полностью загружен.Вы также увидите, что после этого первая строка в списке будет "выбрана".Я не привязываюсь к SelectedIndexValue, как вы можете видеть в коде.DataContext для списка - это ReadOnlyCollection

В моем событии SelectionChanged, как вы можете видеть, я уведомляю другие объекты о загрузке данных, относящихся к выбранному элементу.Я хочу, чтобы это происходило только тогда, когда один из них выбран, но не установлен по умолчанию.У меня есть один из этих ListViews, представляющих похожие данные, но при загрузке ни в одном из них не должен быть выбран элемент.

Я заметил, что выбранный индекс по умолчанию установлен в значение -1 в окне свойств для Listview.Я даже могу установить этот код в событии List_Loaded, но к тому времени первый SelectionChanged уже произошел.

<ListView PreviewMouseDown="ActiveCasesView_MouseDown" x:Name="ActiveCasesView"
                     DataContext="{StaticResource ActiveCasesViewSource}"
                     ItemsSource="{Binding}"
                     ItemTemplate="{StaticResource CasesItemTemplate}"
                     SelectionMode="Single"
                     SelectionChanged="ActiveCasesView_SelectionChanged"
                     ScrollViewer.CanContentScroll="True" 
                     ScrollViewer.VerticalScrollBarVisibility="Auto" >
</ListView>

private void ActiveCasesView_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        if (mouseClicked)
            if (e.AddedItems.Count > 0)
                App.Messenger.NotifyColleagues(App.MSG_SELECT_ACTIVE_CASE, ((CaseViewModel)ActiveCasesView.SelectedItem).CaseNumber);
    }

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

Спасибо Petrus

Другие советы

ListView не должен запускать SelectionChange, если вы установили только свойство ItemsSource.Однако, если вы привяжете свойство SelectedIndex к свойству вашего объекта DataContext, выделение переместится на индекс, указанный в связанном свойстве.

это не вызывает событие Selector_OnSelectionChanged при загрузке страницы:

<ListView SelectionChanged="Selector_OnSelectionChanged" 
                  ItemsSource="{Binding Path=Items}"
                  ></ListView>

но это делает:

<ListView SelectionChanged="Selector_OnSelectionChanged" 
                  SelectedIndex="{Binding Path=SelectedIndexValue}"
                  ItemsSource="{Binding Path=Items}"
                  ></ListView>

потому что SelectedIndex устанавливается в значение selecteindex посредством привязки.

Чтобы избежать этого и по-прежнему сохранять привязки в вашей разметке, установите SelectedIndexValue вашего объекта DataContext равным -1 перед привязкой (перед вызовом InitializeComponent() в вашем конструкторе формы).

Надеюсь, это поможет.

Я не знаю, нужна ли вам еще помощь с этим, но я решил эту проблему, создав переменную, которая отслеживает selectedindex, в моем случае - при первоначальной привязке она всегда равна 0, так что мне немного проще это сделать, однако, если вы сообщите viewmodel соответствующий индекс, я просто добавлю

ComboBox box = e.OriginalSource as ComboBox;
if (_previousIndex == cb.SelectedIndex) return;
//do stuff you need to do with a new SelectedIndex

Вы можете попытаться установить для свойства SelectedIndex значение -1 в вашей привязке, но это также не является элегантным решением.

<ListView PreviewMouseDown="ActiveCasesView_MouseDown" x:Name="ActiveCasesView"
                     DataContext="{StaticResource ActiveCasesViewSource}"
                     ItemsSource="{Binding}"
                     ItemTemplate="{StaticResource CasesItemTemplate}"
                     SelectionMode="Single"
                     SelectionChanged="ActiveCasesView_SelectionChanged"
                     ScrollViewer.CanContentScroll="True" 
                     ScrollViewer.VerticalScrollBarVisibility="Auto" 
**SelectedIndex="-1"**>
</ListView>

Я пытался воспроизвести ваше поведение, но безуспешно.Каков тип коллекции ItemsSource, к которой вы привязываетесь?

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

bool loaded = false;

window.Loaded += new RoutedEventHandler(MainWindow_Loaded);

void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
   windowLoaded = true;
}

private void ActiveCasesView_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
{

if(!loaded)
return ;

//do actions here ....

}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top