Итак, это предположение, но это случилось со мной раньше, и оно того стоит. Но прежде чем догадываться, профилировали ли вы свой код, чтобы увидеть точно , какие вызовы занимают больше всего времени? Я верю вам, когда вы говорите, что при использовании связывания время резко увеличивается, но предложение, которое я собираюсь дать, может быть доказано или опровергнуто с помощью профилирования результатов. Во всяком случае ...
Некоторое время назад я работал над приложением, которое генерировало множество небольших элементов пользовательского интерфейса. Каждый элемент был экземпляром UserControl
и использовал привязку данных для своего появления. Я заметил, что при генерации многих (200+) из этих элементов было заметное отставание.
Мы использовали Prism и его класс ViewModelBase
, передавая делегаты методу RaisePropertyChanged
, т.е.
private int _foo;
public int Foo
{
get { return _foo; }
set
{
if( _foo != value )
{
_foo = value;
RaisePropertyChanged( this.Foo ); // trouble
}
}
}
Проблема в том, что реализация RaisePropertyChanged
должна использовать отражение, чтобы получить имя свойства в виде строки. Когда многие (и я имею в виду много) из них были уволены, был значительный удар производительности.
Решение? Используйте строку вместо объекта функции. Да, это действительно все, что нужно. Это немного воняет, потому что вы должны помнить, что нужно изменить две вещи, если вы когда-либо проведете рефакторинг этого свойства, но, честно говоря, снижение производительности не стоит этого во многих обстоятельствах.
В любом случае, попробуйте. Если внутри RaisePropertyChanged
тратится много процессорного времени, вполне вероятно, что это так.