WPF, MVVM и ComboBox: при переходе на другую модель представления ComboBox обнуляет свойство, привязанное к SelectedItem - PullRequest
1 голос
/ 17 марта 2011

У меня есть окно, которое использует DataTemplates для отображения другого UserControl (представления) в ContentPresenter на основе типа его свойства Content, которое связано со свойством, которое содержит текущую модель представления.Таким образом, изменяя свойство viewmodel с событием, я могу упростить базовую навигацию назад / вперед, которая мне нужна.

При создании новой модели представления передается ссылка на текущую.Возвращение к старому экземпляру viewmodel прекрасно работает для элемента управления CheckBox, но не для созданного мною UserControl, который содержит TextBlock и ComboBox.

Проблема заключается в том, что когда представление, содержащее ComboBox, выгружается,ItemsSource ComboBox обнуляется, что вызывает его очистку его свойств SelectedItem / Text, которые по какой-то причине все еще привязаны к моей модели представления - таким образом, очищая данные, которые он хранит.Я не знаю, как вручную отсоединить их в подходящее время.(Опять же, CheckBox работает просто отлично.)

Я читал, что у других пользователей возникла точно такая же проблема.Для них изменение порядка объявления привязок ItemsSource и SelectedItem / Text таким образом, чтобы атрибуты для последнего были помещены до того, как первый решит проблему.Однако в моем случае это не так.Другие также исправили проблему, игнорируя нулевые / пустые значения, но в моем случае это не сработает.

Я мог бы обойти эту проблему, скопировав интересные данные в отдельный объект и перезагрузив его из этого., но мне нужно было бы добавить код, чтобы инициировать перезагрузку data = больше кода связи для хранения.

Я также мог бы избежать использования DataTemplates и вручную добавлять UserControls в codebehind, что позволило бы мне разбивать данныепривязка перед удалением UserControl.Но это идет вразрез с MVVM.

Я не выше изменяю свой очень не MVVM UserControl для обработки любых событий в ComboBox, который он содержит, чтобы обойти эту проблему.


ОБНОВЛЕНИЕ:

Я немного сузил вопрос.Я реорганизовал код так, чтобы он вручную создавал и добавлял представление UserControl в зависимости от того, какая модель представления была установлена.Эта проблема теперь возникает только тогда, когда я установил для DataContext представления UserControl значение NULL.Если я просто заменю представление, не удаляя ссылку, оно больше не стирает рассматриваемые значения.Это полезный обходной путь, или он создает такие проблемы, как утечки памяти?

Ответы [ 3 ]

0 голосов
/ 17 марта 2011

Я обошел эту проблему, добавив свойство Active и соответствующие методы Activate () / Deactivate () в мой базовый класс viewmodel и вызвав их соответствующим образом при замене viewmodels. Это хорошо вписывается в мое приложение. Конечно, я все еще открыт для других предложений.

0 голосов
/ 18 марта 2011

Может быть, что-то, что "открыло бы разум" для более простого решения ... Если я понимаю вашу проблему, это похоже на прошлую проблему, которая у нас была.В нашем случае мы просто сделали предположение, что невозможно установить конкретное значение в null при доступе к свойству bound, поэтому мы немного подправили соответствующие свойства ViewModel:

public MyItem SelectedItem {
  get {
    return Model.MyItem;
  }
  set {
     if (value != null) {
       // Set and notify if not null
       Model.MyItem = value;
       OnPropertyChanged("SelectedItem");
     }
     else // just notify when trying to set to null
       OnPropertyChanged("SelectedItem");
  }
}

Используя такие подправленные свойствамы смогли заблокировать любую попытку установить значение null, вызвав OnPropertyChanged(..) InSad, существующее значение было вызвано пользовательским интерфейсом.Если необходимо установить значение null, необходимо указать отдельное свойство, позволяющее это.

Не уверен, относится ли это к вашей проблеме.Удачи.

ОБНОВЛЕНИЕ
О, я вижу, вероятно, это описывает тот же метод, что и «Другие также исправили проблему, игнорируя нулевые / пустые значения», который, кажется, не работаетдело.Но я не понимаю, почему этого не следует.

0 голосов
/ 17 марта 2011

Это известная ошибка в ранних версиях WPF, вызванная скачком событий.Это было исправлено для элементов управления, производных от Selector, в .NET 4.0.

Подробнее об этом см. В этом блоге: http://blogs.interknowlogy.com/2011/03/09/event-leapfrogging/

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