WPF новый вид против FindResource - PullRequest
1 голос
/ 06 июля 2010

Мы подключаем наши представления и видим модели «извне», что означает, что у нас где-то есть следующий тип кода:

var viewModel = new MyViewModel();
var view = Application.Current.FindResource("MyView") as UserControl;
view.DataContext = viewModel;

Это своего рода перефразировка.Мы делаем это так, чтобы dll, содержащая все представления, могла быть отключена во время выполнения.До тех пор, пока DLL определяет ресурс с именем «MyView», который указывает на пользовательский контроль, MyView все хорошо.

Моя задача - просто убедиться, что FindResource не страдает или не является значимым способом простого выполненияследующее:

var view = new MyView();

Это можно заменить на IoC.(Мы не позволяем пользователю выбирать, какая DLL-библиотека представления используется. Это определяется при запуске приложения.)

Одна вещь, которую я нашел с FindResource, заключается в том, что вам, возможно, придется использовать x:Shared="False" или ещеWPF вернет вам существующий экземпляр, и вы должны убедиться, что он «инициализирован» обратно в исходное состояние.

Есть мысли?

1 Ответ

2 голосов
/ 07 июля 2010

Объявление экземпляров UIElement как ресурсов почти всегда является плохой идеей.Вы уже видели одну из основных проблем с этим (и обходной путь).Также очень легко вызвать утечки памяти, потому что элементы в ресурсах уровня приложения создаются при запуске и остаются там до тех пор, пока приложение не будет закрыто (если вы не выполняете дополнительную ручную работу, чтобы заставить их очистить).

Использование шаблоновэто гораздо лучшее решение, и оно должно быть очень легко конвертировать из того, что вы уже делаете.Шаблон будет создавать новые экземпляры своих дочерних элементов по мере необходимости и вставлять их локально, как если бы они были объявлены встроенными.Просто оберните существующие объявления UserControl в элементы DataTemplate и переместите объявления x: Key.Затем, когда вы перейдете к приведенному выше коду (это также может быть сделано в XAML или, возможно, неявно с шаблонами DataType), выполните:

var viewModel = new MyViewModel();
var view = Application.Current.FindResource("MyView") as DataTemplate;
var control = new ContentControl { Content = viewModel, ContentTemplate = view };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...