InitializeComponent / ShowDialog和数据绑定

时间:2014-03-19 09:02:31

标签: c# wpf .net-3.5

我正在使用相当复杂的WPF窗口,其中包含很多控件。 在我的上下文中,我们选择的用户体验是首先显示窗口,然后加载数据和数据绑定(同时显示进度条)。

借助Visual Studio中的WPF跟踪,我注意到在显示窗口之前调用了两次数据绑定:

  1. 当我们调用解析XAML的InitializeComponent()时。
  2. 当我们调用ShowDialog()时。
  3. 由于还没有数据,数据绑定机制需要相当长的时间来尝试回退和默认值。

    为了加快向用户显示窗口,有没有办法在窗口显示之前禁用WPF数据绑定?

    提前致谢。

    编辑1 : 我在表单上有400多个控件。对InitializeComponent()的调用需要700ms才能完成。我不知道其中有多少与数据绑定有关,可能是我弄错了。

    编辑2 : 根据dotTrace分析器,InitilizeComponent()WPF成本为65.43%分为:

    • 34.25%System.Windows
    • 22.57%System.Windows.Markup
    • 8.29%其他

    编辑3 : 我们将InitializeComponent()降低到272ms。 我们有很多转换器,singletons现在用于所有转换器。

2 个答案:

答案 0 :(得分:0)

当然。

一个直接的选择是删除与数据绑定相关的XAML标记,并从代码隐藏中执行相同的操作,但仅在窗口显示之后(或在您认为合适的任何其他条件下)。有关如何在代码中进行数据绑定,请参阅此MSDN example

另一个选择是不直接绑定到你的“真实”数据源(不清楚为什么会导致速度减慢,但我会接受你的话)而是代理具有开/关切换的对象:从关闭开关开始,使代理返回空数据集,并在窗口显示后将其打开。

答案 1 :(得分:0)

有趣的一点。绑定时间如此之大?

InitializeComponent() DataContext中通常为空,并且应该花费几毫秒来解析绑定。问题可能出在另一个地方。

在DataBinding机制中使用默认值是清晰,快速和简单的。