2016-07-27 2 views
1

У меня есть код, как этот:Почему использование UserControl внутри DataTemplate медленнее, чем прямой xaml?

<ListBox ItemsSource="{Binding Items}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate DataType="{x:Type local:MyViewModel}"> 

      <!-- xaml is typed here directly --> 
      <Border> 
       ... 
      </Border> 

     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

И XAML внутри DataTemplate является большим (более 200 линий).

Я хочу переместить xaml, находящийся внутри DataTemplate, в отдельный UserControl, чтобы упростить редактирование и обслуживание. Я делаю следующий:

<ListBox ItemsSource="{Binding Items}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate DataType="{x:Type local:MyViewModel}"> 

      <!-- xaml is moved to separate UserControl --> 
      <local:MyViewModelUserControl /> 

     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

Проблема я бегу в том, что рендеринг/обработка второго кода (с UserControl) занимает около 2 раза больше, чем 1-го кода. Есть идеи, как с этим бороться?

ПРИМЕЧАНИЕ. Я перемещаю не ListBox, а xaml, который находится внутри DataTemplate. Причина заключается не в том, чтобы повторно использовать этот код, а для сведения к минимуму основного файла, в который помещается ListBox. Другое дело, что у меня есть несколько DataTemplates внутри ListBox (для нескольких ViewModels), и xaml действительно огромна. Вот почему я хочу переместить этот xaml (который находится внутри DataTemplate) в отдельный элемент управления.

ответ

1

На мой взгляд, нет необходимости отделять Listbox в отдельном UserControl, если вы используете этот ListBox только в одном месте. В любом случае, если вы так обеспокоены оптимизацией кода и созданием элементов многократного использования, то вы можете создать отдельный UserControl. Но вы не можете иметь viewmodel для многоразового usercontrol, так как это основанная на представлении вещь.

Вы должны привязать необходимые свойства списка к Dependency Properties, а затем создать UserControl. Поступая таким образом, вы не нарушаете шаблон MVVM, так как вы делаете этот элемент управления доступным для повторного использования другими пользователями.

Задержка вызвана не тем, что вы сделали. Вероятно, это связано с тем, что время сбора данных или какой-либо другой процесс приводит к задержке приложения.

+0

Я перемещаю не ListBox, а xaml, который находится внутри DataTemplate. Причина заключается не в повторном использовании этого кода, а в том, чтобы свести его к минимуму в основном файле, где размещается ListBox. Другое дело, что у меня есть несколько DataTemplates внутри ListBox (для нескольких ViewModels), и xaml действительно огромна. Вот почему я хочу переместить этот xaml (который внутри DataTemplate) в отдельный элемент управления. Я также добавил эту информацию в ответ. Извините, если я не описал это дело. – Sergey

+0

Но определение шаблонов данных в отдельном файле не так хорошо для лучшей ремонтопригодности и удобочитаемости. Список будет иметь собственную таблицу данных или datatemplates. Это не проблема. Если вы создаете элемент управления многократным списком, это нормально. Но перемещение вашего datatemplate в отдельный файл не звучит так хорошо. – ViVi

+0

У меня есть UserControl, который отображает элемент (некоторого ViewModel) и содержит поведение этого элемента. Я помещаю этот элемент управления в ListBox.ItemTemplate. Это то, что вы можете видеть во втором коде в вопросе. И оказалось, что использование UserControl внутри ItemTemplate в ListBox медленнее, чтобы написать тот же самый xaml непосредственно внутри ListBox.ItemTemplate (вы можете увидеть его в первом коде выше). Это проблема. – Sergey

Смежные вопросы