那么这里的问题是,如果你有一个DataTemplate类型的对象,每次存在对象时,DataTemplate将被创建,这听起来是正确的。WPF DataTemplate性能
我的问题是,我们的DataTemplate有点沉重,应用程序可能有大约1000个使用该DataTemplate的对象。
我创建了一个简单的例子,我创建了5个Person对象,并将它们绑定到一个ListView。 Person对象的DataTemplate是一个带有标签的Grid和带有2个MenuItem的ContextMenu。为了简单起见,我只想集中在MenuItems中。使用内存分析器,我可以看到总共有10个MenuItem对象(每个人2个,5人* 2 MenuItem = 10个MenuItem),我想知道是否有办法避免这种情况。假设每个Person对象都应该共享相同的MenuItem引用,以避免每次创建人员时重复DataTemplate。
这些是内存分析器的结果。
谢谢!
这是我的代码:
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>
使用虚拟化stackpanel我有一个相当复杂的数据模板(我正在玩MemoryMappedFile)约亿行。 – FuleSnabel 2010-08-13 22:01:39