Bind SelectedItem, поскольку привязка ItemsSource не завершена - PullRequest
1 голос
/ 12 декабря 2010

Я столкнулся с проблемой, которая меня удивила. Я не смог найти обсуждения (кроме WPF MVVM ComboBox SelectedItem или SelectedValue не работают возможно).

У меня MVVMФорма, которая имеет 2 ctors, один для "создания нового элемента", другой для "модификации элемента".У меня есть выпадающий список, который представляет одно из свойств элемента.

В модификации ctor инициализируется свойство, связанное с ItemsSource, а затем устанавливается свойство, связанное с SelectedItem.Но в пользовательском интерфейсе ничего не выбрано, если только я не задержу (даже чуть-чуть) набор SelectedItem.

Как я могу решить эту проблему?Я не могу держать таймер с абсолютно случайным интервалом, чтобы решить проблему: D

Спасибо за вашу помощь

Ответы [ 2 ]

0 голосов
/ 13 декабря 2010

Кажется, что элегантный способ обеспечить инициализацию ItemsSource до того, как я установил SelectedItem от ВМ, - это объявить источник привязки ItemsSource (каким бы он ни был) в ресурсах моего представления. Я уверен, что кто-то может привести меня к свету теперь, когда я указал на это.

Я пытался использовать CollectionViewSource, но не нашел способа использовать его возможности Filter без нарушения шаблона MVVM. Кроме того, я не знаю, как повторно поднять фильтр, как это было раньше с ICollectionView.Filter (отфильтрованные элементы зависят от другого выбора в выпадающем списке, ничего особенного на самом деле нет).

Возможно, ресурс, объявленный в представлении и используемый в качестве ItemsSource, не обязательно должен быть CVS, я ищу предложения здесь.

- Edit-- Я обнаружил, что решение IsSynchronizedWithCurrentItem = "True", распространенное по всей сети, на самом деле работает. Я был введен в заблуждение, потому что это не решило мою проблему с первой попытки из-за оставшегося SelectedValuePath, который больше не использовался на моем элементе управления.

0 голосов
/ 13 декабря 2010
public MyViewModel()
{
    this.Items = ...;
    //this.SelectedItem = ...;

    // select in separate message so that the ItemsSource has definitely been set
    this.Dispatcher.BeginInvoke(delegate
    {
        this.SelectedItem = ...;
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...