我有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。
答案 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}" />
...
从ViewModel
或View
更改C后,它会自动(使用INotifyPropertyChanged
帮助)在所有绑定位置更新它。这意味着您不应该运行任何循环或之前的任何操作。
注意:我从头开始建议使用MvvmLight。
答案 2 :(得分:0)
永远不应该在UI线程中运行长时间运行的任务。如果你在这里运行长时间运行的计算,你的UI将会很慢 - 与数据绑定的速度无关。由于您阻止了UI的更新。
如果更改后台线程中的值,则必须使用为您进行线程切换的调度程序。这又带来了开销。
在这两种方式中,您有许多因素会降低您的应用程序速度。 它并没有真正说出数据绑定效率的可靠性。
我建议你在后台线程中编写代码并检查它是否足够快。如果不使用分析器来检查瓶颈在哪里。