【问题标题】:How efficient is databinding in WPF?WPF 中的数据绑定效率如何?
【发布时间】:2012-01-11 22:10:02
【问题描述】:

我有 DP a 和 b,c 通过 i 转换器绑定到它们(请注意,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();
        }

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

【问题讨论】:

  • 听起来您应该将视图与模型分开。查看 MVVM。
  • @AvadaKedavra 我知道 MVVM 是什么,但我不知道如何关联您的答案。
  • 不,不应该。尽可能靠近源代码,您只需一步即可通过 UI 网格进行操作。
  • @TonyHopkinson 什么是 UI 网格?你知道关于 DP 表现的任何 MS 资料吗?
  • @JohnnyGraber 我添加了一些代码。

标签: wpf performance data-binding dependency-properties


【解决方案1】:

我在 for 循环中执行此操作,并且需要很长时间,条件是 i=0; i

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

您一开始不测试数据绑定,您还测试了 100.000 个 tostring 调用。

【讨论】:

    【解决方案2】:

    这里的正确方法是将视图与模型分开。为此,请使用MVVM (在网络中有很多很好的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

    【讨论】:

    • 有趣的想法,我会查看链接。谢谢。
    【解决方案3】:

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

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

    在这两种方式中,您都有许多因素会减慢您的申请速度。 而且它并没有真正说明数据绑定的效率。

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

    【讨论】:

      猜你喜欢
      • 2011-10-06
      • 2020-07-20
      • 1970-01-01
      • 2011-03-14
      • 1970-01-01
      • 2011-05-28
      • 2011-05-14
      相关资源
      最近更新 更多