WPF中数据绑定的效率如何?

时间:2012-01-11 22:10:03

标签: wpf performance data-binding dependency-properties

我有DPs a和b,c通过i转换器绑定到c(注意a和b可能通过转换器绑定到另一个DP)。我修改了它们绑定的a和b或某些DP,然后在计算中使用c。我在for循环中执行此操作,并且需要很长时间,条件为i=0; i<100000; i++)。所以我想知道数据绑定的效率如何?它应该在这样的场景中使用吗? 以下是一些示例代码:

        for ( int i = 0; i < 100000; i++){
            //... code to pick m based on some random numbers
            hazards[m].Reactant1.Count -= 1;
            hazards[m].Reactant2.Count -= 1;
            hazards[m].Product.Count += 2;
            display.Text = hazards[m].Value.ToString();
        }

hazard.Value通过转换器与反应物的计数绑定,反应物的计数绑定到文本框文本属性。根据危险值和一些随机数选择m。

3 个答案:

答案 0 :(得分:2)

  

我在for循环中执行此操作,并且需要很长时间,条件是i = 0; I&LT; 100000;   我++)。所以我想知道数据绑定的效率如何?它应该用在像这样的场景中   此?

这是问题 - 错误测试。谁在乎?如果您认为您可以在屏幕上显示100000个更新,并且用户跟随您就已经弄错了。此外,还存在如何/何时在紧密循环情况下更新屏幕的问题 - 您可能会被限制为每秒60次更新。

你不测试数据绑定开始,你测试ALSO 100.000 tostring调用。

答案 1 :(得分:1)

这里正确的方法是将视图与模型分开。为此目的,使用MVVM (web中有很多很好的INotifyPropertyChanged实现)。当 ViewModel 准备好时(我是基础ViewModel) - 应该实现类似的东西:

[ViewModel] .cs

private double _c;
public double C
{
  get { return _c; }
  set 
  { 
      if (_c != value)
      {
          _c = value;
          RaisePropertyChanged("C");
      }
}

[页] 的.xaml

...
<UserControl.Resources>
  <vm:ViewModel />
  ...
</UserControl.Resources>
...
<TextBox x:Name="A" Text="{Binding C, Converter={StaticResource someConverter} Mode=TwoWay}" />
...
<TextBlock x:Name="B" Content="{Binding C, Mode=TwoWay}" />
...

ViewModelView更改C后,它会自动(使用INotifyPropertyChanged帮助)在所有绑定位置更新它。这意味着您不应该运行任何循环或之前的任何操作。

注意:我从头开始建议使用MvvmLight

答案 2 :(得分:0)

永远不应该在UI线程中运行长时间运行的任务。如果你在这里运行长时间运行的计算,你的UI将会很慢 - 与数据绑定的速度无关。由于您阻止了UI的更新。

如果更改后台线程中的值,则必须使用为您进行线程切换的调度程序。这又带来了开销。

在这两种方式中,您有许多因素会降低您的应用程序速度。 它并没有真正说出数据绑定效率的可靠性。

我建议你在后台线程中编写代码并检查它是否足够快。如果不使用分析器来检查瓶颈在哪里。