WPF ListBox DataContextChanged триггеры SelectionChanged

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

Нравится:

<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 события?


person PScr    schedule 16.09.2015    source источник


Ответы (1)


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

e.Handled = True;
person Muds    schedule 16.09.2015
comment
Спасибо, я попробую, но не вижу, чтобы это препятствовало запуску новых событий при изменении выделения. - person PScr; 16.09.2015
comment
Грязь, я попробовал, и без разницы. Думаю, по двум причинам. - person PScr; 16.09.2015
comment
... две причины. Во-первых, в событии SelectionChanged нет ничего интересного. Но я не понимаю, почему я не должен останавливать его бурение. Во-вторых, есть event, когда DataContext изменяется и ListBox повторно заселяется. Я получаю event, когда это происходит, и ничего не выбрано (SelectedItem == null). Затем выбирается первый элемент, если он есть, и SelectionChanged запускается снова (и с моим кодом DataContext изменяется на этот первый элемент, и мы идем. Пока мы не дойдем до пустого ListBox. - person PScr; 16.09.2015