Насколько эффективно связывание данных в WPF? - PullRequest
1 голос
/ 12 января 2012

У меня есть 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 выбирается на основе значения опасности и некоторых случайных чисел.

Ответы [ 3 ]

2 голосов
/ 12 января 2012

Я делаю это в цикле for, и это занимает очень много времени, условия: i = 0;я <100000;я ++).Поэтому мне интересно, насколько эффективно связывание данных?И стоит ли его использовать в подобных сценариях? </p>

В чем проблема - ложный тест.КАКАЯ РАЗНИЦА?Если вы думаете, что можете отобразить 100000 обновлений на экране с подписчиком, вы уже ошиблись.Кроме того, существует проблема, связанная с тем, как / когда экран обновляется по сценарию с жестким циклом - вполне возможно, что вы будете связаны с 60 обновлениями в секунду.

Вы НЕ проверяете привязку данных для начала, вы тестируете ТАКЖЕ 100.000 ТОСТРОВвызовы.

1 голос
/ 12 января 2012

Правильный путь здесь будет для отделения вида от модели .Для этого используйте MVVM (есть много хороших реализаций INotifyPropertyChanged в сети).Когда будет подготовлено ViewModel (я имею в виду базовую ViewModel) - следует реализовать что-то вроде:

[ViewModel] .cs :

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

[Page] .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}" />
...

После изменения C на ViewModel или View он автоматически (с помощью INotifyPropertyChanged) обновит его во всех связанных местах.Это означает, что вы не должны запускать какие-либо циклы или делать то, что делаете раньше.

ПРИМЕЧАНИЕ. С нуля советую использовать MvvmLight .

.
0 голосов
/ 12 января 2012

Долгосрочная задача никогда не должна выполняться в потоке пользовательского интерфейса. Если вы запустите здесь длительный расчет, ваш пользовательский интерфейс будет медленным - независимо от скорости привязки данных. Так как вы блокируете обновления пользовательского интерфейса.

Если вы измените значение в фоновом потоке, то вам придется использовать диспетчер, который сделает переключение потока для вас. Это снова идет с накладными расходами.

В обоих случаях у вас есть много факторов, которые замедляют ваше приложение. И это действительно не говорит ничего надежного об эффективности привязки данных.

Я предлагаю вам написать свой код в фоновом потоке и проверить, достаточно ли он быстр. Если не используете профилировщик, чтобы проверить, где ваше узкое место.

...