почему мой элемент управления, связанный с ObservableCollection, переходит на 1-й элемент? - PullRequest
0 голосов
/ 07 октября 2009

У меня есть TDI, связанный с наблюдаемой коллекцией рабочих пространств (все основано на демонстрации MVVM Джоша Смита). На одной вкладке находится пользовательский элемент управления, также связанный с наблюдаемой коллекцией. Если я переключаю вкладки, пользовательский элемент управления всегда возвращается к 1-му пункту.

Я немного отчаялся. Я искал с 5 часов сейчас, но я просто не могу понять, почему он это делает или где искать.

Я упростила все это настолько, насколько я могла, и загрузила его в:

Ваша помощь очень ценится!

Я использую C # Express 2008.

1 Ответ

1 голос
/ 07 октября 2009

Проблема здесь в том, что TabControl создает новый DataTemplate для своего содержимого каждый раз, когда вы выбираете другой элемент вкладки, поэтому ваше представление воссоздается со всеми настройками по умолчанию. Вы должны реализовать механизм, чтобы иметь уникальное представление для данной модели представления. Без MVVM вы бы просто добавили свойство View в ViewModel, но это в значительной степени противоречит цели MVVM.

Отредактируйте, следуя вашим комментариям: Я имел в виду, что каждый раз, когда вы переключаете вкладку, TabControl будет отображать ее содержимое с использованием нового визуального дерева из DataTemplate.

Давайте рассмотрим пример:

  1. Вы выбираете вкладку # 1, ее содержимое является CustomerViewModel. Новое визуальное дерево (из вашего NewCustomerView) создается из DataTemplate и показывается в TabControl. Знак вставки находится в первом текстовом поле, на вкладке выбран первый индекс и т. Д.

  2. Вы выбираете вкладку № 2. Содержимое из вкладки № 1 больше не находится в визуальном дереве и отбрасывается. Содержимое из вкладки №2 будет следовать тому же процессу, что и 1. для построения дерева.

  3. Вы снова выбираете вкладку # 1. Содержимое из вкладки № 2 больше не находится в визуальном дереве и отбрасывается. И здесь снова активируется тот же механизм. Новое визуальное дерево построено из DataTemplate со всем по умолчанию. Woops! Но это нормально, поскольку WPP ContentPresenter не будет хранить дерево содержимого в памяти для каждого возможного объекта, который когда-то был его содержимым.

=> Теоретическое решение, создайте себе визуальный образ. Например, в совершенно несовершенном мире создает уникальный NewCustomerView в вашей CustomViewModel и предоставляет его через свойство, скажем, View. Новый DataTemplate, который вы будете использовать, будет:

<DataTemplate DataType="{x:Type CustomerViewModel}">
    <ContentPresenter Content="{Binding View}" />
</DataTemplate>

И вуаля, когда визуальное дерево создается из шаблона, презентатор будет совершенно новым, но представление будет уникальным и не будет воссоздано, поэтому каретка будет находиться в том же месте, где ее оставил пользователь, то же самое для вкладок.

Но, как я уже говорил, это не совсем подходит философии MVVM. Попробуйте создать статический класс, который может возвращать уникальный View для заданной ViewModel или что-то в этом роде.

Другим решением будет добавить в вашу ViewModel такие вещи, как SelectedTabIndex и связать их, CurrentFocusPosition и тому подобное, но это полностью связано со мной.

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