В нашем продукте мы используем первый подход к модели MVVM, и он работает красиво, но с одним оговором. Когда представление становится сложным, требуется время, чтобы создать его из шаблона данных. Если просмотр отображается и скрывается часто, он становится немного раздражающим. Если сначала использовать представление, было бы достаточно легко кэшировать представление, если это необходимо, но при первом использовании DataTemplate и модели у нас нет большого контроля над созданием представления. Кто-нибудь решил эту проблему уже без переключения на первый метод просмотра?Можно ли кэшировать представление при первом использовании модели?
ответ
с видом на первый взгляд с видом. Я думаю, что у вас нет шансов «кэшировать» представление. поэтому вы можете рассмотреть возможность использования view first и локатор viewmodel для рабочих процессов с тяжелыми данными. here - решение при использовании наборов данных со списками.
но возможно есть какое-либо решение с переопределением механизма передачи данных wpf?
Редактировать: что делать, если вы создаете только «markerview» для своей модели просмотра, поэтому wpf datatemplate может ее найти. а затем в этом маркерном представлении вы создаете/регидратируете реальный вид? что-то вроде локатора просмотра представлений?
Прекрасно работает при использовании идеи @blindmeis.
Общий рецепт:
Создать ContentControl или UserControl с именем ViewCache:
public partial class ViewCache
{
public ViewCache()
{
InitializeComponent();
Unloaded += ViewCache_Unloaded;
}
void ViewCache_Unloaded(object sender, RoutedEventArgs e)
{
Content = null;
}
private Type _contentType;
public Type ContentType
{
get { return _contentType; }
set
{
_contentType = value;
Content = ViewFactory.View(value); // use you favorite factory
}
}
}
В DataTemplate, используйте ViewCache, передать тип реального зрения вы хотите использовать:
<Window.Resources>
<DataTemplate DataType="{x:Type TestViewCache:Foo}">
<TestViewCache:ViewCache ContentType="{x:Type TestViewCache:View }"/>
</DataTemplate>
</Window.Resources>
<StackPanel>
<ContentPresenter Height="200" Width="300"
Content="{Binding ViewModel}"/>
<Button Content="Set VM" Click="SetVMClick"/>
<Button Content="UnSet VM" Click="UnSetVMClick"/>
</StackPanel>
Спасибо, но лучше напишите var control = view as Control; control.DataContext = DataContext; Content = view; –
Эй, Сергей, я искал решение для кэша просмотра и нашел вашу реализацию. Я не совсем понимаю, как получить доступ к модели представления из родительской модели просмотра. Нужно ли мне также обращаться к «ViewCache»? И как изменилось представление, которое затем реализовано в модели основного вида? – derape
- 1. DefaultMessageListenerContainer: можно ли кэшировать потребителя при использовании глобальных транзакций
- 2. Можно ли кэшировать виджеты?
- 3. Можно ли кэшировать холсты?
- 4. Можно ли кэшировать Apple Maps?
- 5. Как кэшировать строку вместо экземпляра модели при использовании SQLAlchemy?
- 6. Можно ли кэшировать статические карты Google?
- 7. можно ли кэшировать с php?
- 8. iOS - можно ли кэшировать CGContextDrawImage?
- 9. Как кэшировать представление фрагмента
- 10. Можно ли кэшировать результат моего пользовательского ActionFilterAttribute?
- 11. Можно ли отслеживать представления вида модели, если представление кэшировано?
- 12. PHP, MySQL: Можно ли кэшировать подзапрос?
- 13. Как кэшировать ответ JSONP при использовании WinJS.xhr?
- 14. Можно ли кэшировать API Google Maps API?
- 15. Можно ли кэшировать мой заголовочный файл?
- 16. Нужно ли кэшировать загруженные скрипты при использовании StackExchange.Redis?
- 17. Нужно ли кэшировать RDD при использовании более одного раза?
- 18. MVC 5 - Лучший способ кэшировать пользовательские данные при первом посещении?
- 19. Можно ли кэшировать CGRect в NSCache?
- 20. Можно ли кэшировать видео? IOS - Swift
- 21. iOS - Можно ли кэшировать ответный HTTP-ответ?
- 22. Можно ли заставить браузер кэшировать результат OPTIONS
- 23. Можно ли кэшировать json-файл в cocos2d?
- 24. Можно ли кэшировать один экземпляр объекта javax.sql.Datasource?
- 25. Можно ли кэшировать методы POST в HTTP?
- 26. Можно ли кэшировать IEnumerable ленивые результаты оценки?
- 27. Можно ли кэшировать коллекции в кеше сеанса?
- 28. Можно ли кэшировать результаты возврата от функции?
- 29. Можно ли кэшировать частично выполненные запросы LINQ?
- 30. Можно ли кэшировать динамическую веб-страницу?
Идеальная идея на «markerview», я посмотрю, если это сработает ... –
дайте мне знать, если это работает;) – blindmeis