2015-09-16 4 views
0

У меня есть пользовательский элемент управления, содержащий расширитель. Содержание эксмандера - это ListBox, связанный с объектом, и DataTemplate отображает его правильно. Проблема заключается в следующем: пользователь может выбрать элемент Listbox, а обработчик SelectionChanged изменил DataContext ListBox на выбранный объект.WPF ListBox DataContextChanged триггеры SelectionChanged

Как это:

<ListBox 
    Name="RelativesLB" ItemsSource="{Binding Relatives}", 
    ItemsTemplate ="{...}", 
    Selectionchanged="Relatives_OnSelectionChanged" /> 

И:

Relatives_OnSelectionChanged(object sender, ...EventArgs e) 
{ 
    var who = (sender as ListBox).SelectedItem as Person; 
    if (who == null) 
     return; 

    People.DataContext = who; 

Вот проблема:

  1. В SelectionChanged срабатывает событие.
  2. Изменен DataContext, и ListBox повторно заполняется.
  3. SelectionChanged Событие пожаров с SelectedItem = null. Здесь мой код не меняет DataContext; он просто возвращается.
  4. SelectionChanged Событие снова начинается с SelectedItem = <whatever is first>. Здесь мой код снова меняет DataContext на этот элемент Мне не нужен этот бит. На самом деле, я хочу, чтобы остановить после 2.
  5. Datacontext изменяется на <whatever is first>

  6. ...
    и так далее, пока мы не получим пустой Person.Relatives, то мы останавливаемся.

Что я хочу, это остановка после первого изменения DataContext. Вы выбираете person из коллекции Relatives и получаете представление для этого человека.

Как я могу остановить последующие обстрелы событий SelectionChanged?

ответ

0

Я думаю, в вашем на Relatives_OnSelectionChanged вам нужно установить

e.Handled = True; 
+0

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

+0

Грязи, я попробовал, и это не имело значения. Я думаю, это по двум причинам. – PScr

+0

... 2 причины. Во-первых, ничего не интересного в событии 'SelectionChanged'. Я не понимаю, почему я не должен останавливать это. Во-вторых, есть «событие», когда «DataContext» изменяется, и «ListBox» повторно заселен. Я получаю «событие», когда это происходит, и ничего не выбрано ('SelectedItem == null'). Затем первый элемент выбирается, если он есть, и снова срабатывает «SelectionChanged» (и с моим кодом «DataContext» изменяется на этот первый элемент и продолжается. До тех пор, пока мы не получим пустой «ListBox». – PScr

Смежные вопросы