Поведение нечетного связывания в WPF - PullRequest
1 голос
/ 12 января 2010

Я постараюсь объяснить это как можно более кратко. У меня есть 2 объекта, первый из которых мы будем называть объектом A со свойством Id, а второй мы будем называть объектом B со свойством ParentId. Очевидная связь заключается в том, что ParentId объекта B установлен в свойство Id объекта A. Я использую шаблон MVVM, поэтому в модели представления у меня есть 2 ObservableCollections, одна из которых содержит объекты A, другие объекты B. При создании модели представления я создаю и заполняю ObservableCollection <'A'> с именем ListItems. Мой xaml прост,

<StackPanel>
    <ListBox IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding ListItems}">
    </ListBox>

    <ComboBox SelectedValuePath="ParentId" SelectedValue="{Binding Path=ListItems/Id, Mode=OneWay}" ItemsSource="{Binding ComboItems}">
    </ComboBox>

    <Button Click="Button_Click" Content="Push Me"/>            
</StackPanel>

Как вы можете видеть, SelectedValue комбинированного списка привязано к свойству Id текущего элемента ListItems. Таким образом, список и комбобокс находятся в основных деталях.

Если вы нажмете кнопку, она заполнит ObboableCollection <'B'> именем ComboItems, который, в свою очередь, заполнит поле со списком. Теперь здесь начинается странность. Когда я запускаю программу, если единственное, что я делаю, это нажимаю кнопку, а затем после слов выбираю элемент в списке, выпадающий список будет правильно выбирать элемент из-за привязки SelectedValue. Но если я запускаю программу и сначала выбираю элемент в списке, а затем нажимаю кнопку, текущий элемент списка не изменяется с текущим элементом списка. Обвязка кажется сломанной навсегда. Кто-нибудь знает, почему это происходит?

Ps. Если я установлю ItemsSource в выпадающем списке до того, как я установлю SelectedValue / SelectedValuePath, привязка master / detail никогда не будет работать. Я знаю, что есть порядок в xaml, но это кажется немного хрупким. Так что, если у кого-то есть вклад в это, я весь в ушах.

Спасибо, Нейт

РЕДАКТИРОВАТЬ -

При связывании SelectedValue оно очень хрупкое. Если привязка работает, то есть ничего не выбрано в списке, а затем заполнена в выпадающем списке, если вы выберете элемент в выпадающем списке, привязка прекратится. После того, как много времени было потрачено на это, я решил связать SelectedItem. Эта привязка не нарушается ни в одном из указанных выше условий. Однако я бы взял любые ответы на вопрос, почему привязка SelectedValue является настолько нелепой. Еще раз спасибо всем, кто ответил или ответит.

1 Ответ

2 голосов
/ 12 января 2010

Да, это проблема, с которой мы сталкиваемся довольно часто.

Проблема в том, что после того, как свойство ItemsSource получит новое значение, привязка SelectedValue будет очищена. Отстой, и до сегодняшнего дня мы не нашли правильного решения.

Вот несколько обходных путей:

  • Сброс привязки SelectedValue в коде, как только будет установлен новый ItemsSource. Вы можете сделать это в конвертере или в другом месте, которое вы будете знать, которое заменит привязку ItemsSource (например, событие DataContextChanged).

  • Вместо использования Binding на ItemsSource, попробуйте использовать CollectionViewSource и фильтр. Поместите все свои предметы в объект CollectionViewSource и отфильтруйте их, когда ваш комбинированный список изменяет значение.

  • Вручную получите ваш предмет по старинке, когда ваш список выводит событие SelectionChanged.

Имейте в виду, все решения не самые красивые в книге. Я бы пошел на вариант 2, его самое чистое ИМО;)

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

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