2016-07-27 55 views
1

我的代碼,因爲這一個:爲什麼在DataTemplate中使用UserControl比直接使用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行)。

我想將DataTemplate中的xaml移動到單獨的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> 

我遇到的問題是渲染/處理第二碼(與用戶控件)花費的時間比第一次長碼的2倍左右。任何想法如何處理它?

注:我正在移動的不是ListBox,而是DataTemplate中的xaml。原因不在於重用此代碼,而是爲了最小化放置ListBox的主文件。其他的事情是我在ListBox中有幾個DataTemplates(對於幾個ViewModel),而且xaml真的很大。這就是爲什麼我想將這個xaml(它在DataTemplate中)移動到一個單獨的控件。

回答

1

在我看來,如果你只在一個地方使用這個ListBox,那麼現在就不需要把Listbox分隔成一個單獨的UserControl。 無論如何,如果您非常在意優化代碼並創建可重用控件,那麼您可以創建一個單獨的UserControl。但是你不能擁有可重用的用戶控件的視圖模型,因爲它是基於視圖的東西。

您必須將列表框所需的屬性綁定到Dependency Properties,然後創建UserControl。通過這樣做,您不會違反MVVM模式,並且您可以使控件可供其他人重用。

造成的延遲不是由於您所做的。這可能是由於數據獲取時間或其他一些導致應用程序滯後的進程。

+0

我不是在移動ListBox,而是在DataTemplate中的xaml。原因是不重用此代碼,而是在放置ListBox的主文件中將其最小化。其他的事情是我在ListBox中有幾個DataTemplates(對於幾個ViewModel),而且xaml真的很大。這就是爲什麼我想將這個xaml(它在DataTemplate中)移動到一個單獨的控件。我也已將此信息添加到答案中。對不起,如果我描述的情況不明確。 – Sergey

+0

但是,將數據模板定義在單獨的文件中對於更好的可維護性和可讀性來說並不那麼好。列表將具有其自己的數據模板或數據模板。這不是問題。如果創建可重用的列表控件,那很好。但是將你的數據模板移動到一個單獨的文件聽起來不太好。 – ViVi

+0

我有一個UserControl顯示一個項目(的某些ViewModel)幷包含此項目的行爲。我把這個控件放在ListBox.ItemTemplate中。這就是你可以在問題的第二個代碼中看到的內容。而且它似乎在ListBox的ItemTemplate裏面使用UserControl比在ListBox.ItemTemplate中直接寫入相同的xaml要慢(你可以在上面的第一個代碼中看到它)。這是問題。 – Sergey

相關問題