WPF - каскадные комбинированные списки, зависимые не обновляются - PullRequest
1 голос
/ 01 декабря 2010

У меня есть три ComboBox, так что список элементов C зависит от выбранного элемента в B, а список элементов B зависит от выбранного элемента в A. У меня есть ObservableCollection определенных классов для ItemsSource на каждом ComboBox и я хочу, чтобы свойство Name выбранного элемента было передано в свойство в другом классе. Например:

ObservableCollection<AClass> Items
=> ItemsSource of cbo_A ComboBox

И selectedInstanceOfAClass.Name должны быть переданы в свойство Data.AClassName. У меня проблема в том, что когда я выбираю значение в ComboBox A первый раз, B ComboBox получает соответствующие элементы на основе выбранного элемента в A, как и ожидалось. То же самое, когда я выбираю элемент в B в первый раз - C получает нужные элементы. Однако, когда я выбираю другое значение в A, элементы в B обновляются, но выбранное значение B остается неизменным, и когда я пытаюсь выбрать новое значение в B из его новых элементов, выбор не меняется. - остается тем же выбранным значением, которое я изначально выбрал в B.

Вот тот XAML, который у меня сейчас есть:

<ComboBox x:Name="cbo_A"
    ItemsSource="{Binding Path=Lists.AItems, Mode=OneWay}"
    DisplayMemberPath="Name" SelectedValuePath="Name"
    SelectedValue="{Binding Path=Data.AClassName, ValidatesOnDataErrors=True,
        Mode=OneWayToSource}" />

<ComboBox x:Name="cbo_B"
    ItemsSource="{Binding ElementName=cbo_A, Path=SelectedItem.BItems, Mode=OneWay}"
    SelectedValuePath="Name" DisplayMemberPath="Name"
    SelectedValue="{Binding Path=Data.BClassName, ValidatesOnDataErrors=True,
        Mode=OneWayToSource}"/>

<ComboBox x:Name="cbo_C"
    ItemsSource="{Binding ElementName=cbo_B, Path=SelectedItem.CItems, Mode=OneWay}"
    SelectedValuePath="Name" DisplayMemberPath="Name"
    SelectedValue="{Binding Path=Data.CClassName, Mode=OneWayToSource,
        ValidatesOnDataErrors=True}" />

Что вызывает странное поведение с выбранным значением, которое не обновляется, даже когда я явно щелкаю ComboBox и пытаюсь изменить значение?

Редактировать: при отладке, когда у меня был обработчик SelectionChanged на cbo_A, а другой на cbo_B, я ввел обработчик cbo_B перед cbo_A, поэтому выбранный элемент с точки зрения B все еще был старый элемент, потому что A еще не обновлялся. : /

Редактировать 2: если я переверну порядок своих ComboBox в XAML, предложенный этим вопросом , так что C предшествует B раньше, чем A, я сначала вводю обработчик A. Когда я затем ввожу обработчик для cbo_B, свойство SelectedItem показывает старое значение (ранее выбранное, прежде чем я выбрал новое значение в cbo_A), даже если я щелкнул значение из нового списка элементов, отображаемых вверх в поле со списком.

Редактировать 3: Я пробую версию этот ответ и получаю ту же проблему: я вижу новые значения в ComboBox B при изменении выбранного значения ComboBox A, но Я не могу изменить выбранное значение в B после того, как я уже установил его один раз. Я начинаю думать, что у меня что-то не так.

1 Ответ

1 голос
/ 01 декабря 2010

Ничего себе. Поэтому не спешите с реализацией нескольких IEquatable<T> Equals методов для новых классов, потому что в итоге вы можете сделать то, что я сделал:

if (ReferenceEquals(this, other))
{
    return false;  // Say what??
}

Вздох. Я заставил свои комбо-боксы работать:

  • Исправление моего BClass.Equals(BClass other) метода;
  • Использование этого ответа о наличии другого класса модели представления с другими свойствами, такими как SelectedAItem и AItems; и
  • Использование этого ответа о размещении моих объявлений XAML в другом порядке, поэтому cbo_C предшествует cbo_B, а cbo_B предшествует cbo_A.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...