我有performance problems,我正试图挖掘原因。
到目前为止,我不确定问题是什么,以及我的下一个假设是它的数据模板。问题:使用数据模板有多贵??
让我们看看单个数据模板有多贵。以下是mcve。
XAML:
<Window.Resources>
<DataTemplate DataType="{x:Type local:Item}">
<StackPanel>
<TextBlock Text="{Binding Property1}" />
... we will add here more things to see difference
</StackPanel>
</DataTemplate>
</Window.Resources>
<ContentControl Content="{Binding Content}" />
CS:
class Item : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public string Property1 { get; set; } = "1";
public string Property2 { get; set; } = "2";
public string Property3 { get; set; } = "3";
public string Property4 { get; set; } = "4";
public string Property5 { get; set; } = "5";
}
class ViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public object Content { get; set; } = new Item();
}
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = new ViewModel();
}
}
以下是一些结果(使用VS Profiler测量 - 以ms为单位的应用程序时间轴):
Test Nb Ni Presenter Items Bindings
A 1 1 2.42 (0.57) 1.8
B 5 5 3.37 (1.15) 1.8, 0.07, 0.1, 0.05, 0.08
C 5 10 3.63 (1.27) 0.06, 0.07, 0.08, 0.04, 0.04 1.7, 0.08, 0.05, 0.06, 0.05
D 0 1 3.38 (0.6) 2.7
说明:
ContentPresenter
(总/自我); TextBlock
具有单Text
个绑定。TextBlock
以将Text
绑定到其他属性。TextBlock
静态Text="123"
。TextBlock
除静态文本以外的所有内容。从我所看到的,模板本身需要0.5 ms
。创建第一个项目需要付出很大的代价(为什么???)。
说实话,我不确定这种方法的正确性来衡量绩效。因此我的问题。我应该避免使用数据模板并开始使用旧的winforms方式手动填充控件以获得性能还是什么?