Почему конструктор представления не вызывается каждый раз, когда я создаю новую модель представления? - PullRequest
1 голос
/ 05 мая 2011

Я использую WPF с шаблоном модель-вид-вид-модель. У меня есть ResultsView и ResultsViewModel, которые связаны следующим образом:

            <DataTemplate DataType="{x:Type VM:ResultsViewModel}">
                <VW:ResultsView/>
            </DataTemplate>

В моем главном окне у меня есть какая-то постраничная настройка, в которой свойство MainContent хранит текущую страницу (экземпляр ViewModel).

Я создаю такую ​​страницу

MainContent = new ResultsViewModel();

ResultsView основан на UserControl, у него также есть обработчик для события Loaded, который выполняет некоторые функции инициализации пользовательского интерфейса.

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

Но если пользователь открывает окно ResultsView два раза подряд, конструктор ResultsView будет не , вызванным во второй раз, а также событие Loaded не вызывается. Кажется, что теперь у меня есть тот же старый экземпляр ResultsView, присоединенный к новому ResultsViewModel ()!

Почему WPF не создает новый View каждый раз, когда я создаю новую ViewModel? Есть ли способ заставить WPF отказаться от старого представления, если старая модель просмотра уничтожена?

Ответы [ 2 ]

7 голосов
/ 05 мая 2011
<DataTemplate x:Shared="False" DataType="{x:Type VM:ResultsViewModel}">
    <VW:ResultsView/>
</DataTemplate>
2 голосов
/ 05 мая 2011

См. Ответ Кента для практического решения вашей проблемы.

Тем не менее, хорошей практикой является создание экземпляра View только один раз, так как есть издержки, связанные с созданием дерева визуалов и настройкой всех привязок. Как правило, View / ViewModel должен быть спроектирован таким образом, чтобы вы могли поменять базовую ViewModel без заботы или даже уведомления об этом (кроме изменения DataContext и, следовательно, переоценки всех значений привязки.) готовится к определенной модели представления, рассмотрите возможность регистрации для уведомления о том, когда вместо этого меняется DataContext (см. этот пример ).

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