2010-08-13 4 views
0

글쎄, 여기서 문제는 개체 유형에 대해 하나의 DataTemplate이 있고 개체가있을 때마다 DataTemplate이 생성된다는 것입니다.WPF DataTemplate 성능

내 문제는 우리의 DataTemplate이 무겁고 그 응용 프로그램이 DataTemplate을 사용하는 약 1000 개의 개체를 가질 수 있다는 것입니다.

저는 5 Person 개체를 생성하고 ListView에 바인딩하는 간단한 예제를 만들었습니다. Person 개체의 DataTemplate은 Label이있는 Grid 및 2 개의 MenuItem이있는 ContextMenu입니다. 간단히하기 위해 MenuItems에 집중하려고합니다. 메모리 프로파일 러를 사용하면 총 10 개의 MenuItem 객체 (Person 당 2 개, 5 Person * 2 MenuItem = 10 MenuItem)가 있음을 알 수 있습니다.이를 피할 수있는 방법이 있는지 알고 싶습니다. 예를 들어, Person 객체가 생성 될 때마다 DataTemplate을 복제하지 않으려면 모든 Person 객체가 동일한 MenuItem 참조를 공유해야합니다.

다음은 메모리 프로파일 러의 결과입니다.

감사합니다!

내 코드입니다 :

C#을

using System.Collections.Generic; 
using System.Windows; 

namespace MenuItemsTest 
{ 
    /// <summary> 
    /// Interaction logic for Window1.xaml 
    /// </summary> 
    public partial class Window1 : Window 
    { 
     public Window1() 
     { 
      InitializeComponent(); 

      this.DataContext = new List<Person>() 
      { 
       new Person("Jim Morrison"), 
       new Person("Jimmy Page"), 
       new Person("Jimmy Hendrix"), 
       new Person("Janis Joplin"), 
       new Person("Peter Frampton") 
      }; 
     } 
    } 

    public class Person 
    { 
     public string Name { get; set; } 

     public Person(string name) 
     { 
      this.Name = name; 
     } 
    } 
} 

XAML :

<Window x:Class="MenuItemsTest.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:MenuItemsTest" 
    Title="Window1" Height="300" Width="300"> 
    <Window.Resources> 
     <DataTemplate DataType="{x:Type local:Person}"> 
      <Grid> 
       <Grid.ContextMenu> 
        <ContextMenu> 
         <MenuItem Header="Select" /> 
         <MenuItem Header="Deselect" /> 
        </ContextMenu> 
       </Grid.ContextMenu> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="*" /> 
       </Grid.ColumnDefinitions> 
       <Label Content="{Binding Name}" /> 
      </Grid> 
     </DataTemplate> 
    </Window.Resources> 
    <Grid> 
     <ListView ItemsSource="{Binding}" /> 
    </Grid> 
</Window> 

답변

0

DataTemplates 길을 가야하는 것입니다하지만 당신은 20을 말한다면 그들 모두가 instansiated 싶지 않아 화면에 표시됩니다 :

스택 패널 가상화를 시도해보십시오. 목록보기 기능이 필요하지 않은 경우 ListBox를 선택하십시오. 간단한 제어 => 성능 향상.

가상화 스택 패널을 사용하는 경우에도 모든 데이터 템플릿을 instansiate하므로 ListView 차원에 제한이 없도록해야합니다 (예 : 스크롤 뷰어를 설정하지 않음).

<ListView 
    ScrollViewer.HorizontalScrollBarVisibility="Disabled" 
    ScrollViewer.VerticalScrollBarVisibility="Auto" 
    VirtualizingStackPanel.IsVirtualizing="True" 
    VirtualizingStackPanel.VirtualizationMode="Standard" 
    ItemsSource="{Binding}" 
    /> 
+0

가상화 스택 패널을 사용하여 나는 꽤 복잡한 데이터 템플릿으로 수십억 개의 행을 지니고있었습니다 (저는 MemoryMappedFile로 놀고있었습니다). – FuleSnabel