Рассмотрим следующее свойство ViewModel:
private string _slowProperty;
public string SlowProperty
{
get { return _slowProperty; }
set
{
_slowProperty = value;
RaisePropertyChanged("SlowProperty");
}
}
Который привязан к текстовому полю, например:
<TextBox Text="{Binding SlowProperty}" />
Теперь проблема в том, что каждый раз значение SlowProperty каждый разизменения, и это происходит довольно часто, текстовое поле будет пытаться получить его значение, которое является довольно медленным.Я мог бы смягчить ситуацию, используя асинхронное связывание, однако, это все равно будет тратить впустую циклы процессора.
Вместо этого я хотел бы получить что-то вроде:
<TextBlock Text="{z:DelayedSourceBinding SlowProperty}" />
Что бы попытатьсяполучить привязку после определенной задержки.Так, например, если SlowProperty
менялось 5 раз подряд, в течение короткого времени, то в текстовом поле будет виден только последний текст.
Я нашел следующий проект который выполняет что-то подобное, поэтому в моем примере я мог бы использовать его так:
<TextBox Text="{z:DelayBinding Path=SearchText}" />
Проблема в том, что он обновляет привязку target только после задержки.Однако путь к источнику оценивается, и его метод получения выполняется при каждом изменении источника.Который, в случае SlowProperty
все равно будет тратить циклы процессора.
Я пытался создать свой собственный класс отложенного связывания, но застрял .Есть ли другие связующие, которые могут сделать что-нибудь подобное?
Для полноты картины, есть еще 2 проекта, которые выполняют подобные задачи, но ни один из них не решает проблему, с которой я сталкиваюсь:
DeferredBinding - решение, подобное DelayBinding.Однако использовать его немного сложнее.
DelayedBindingTextBox - Реализует отложенное связывание с использованием пользовательского элемента управления textbox.
Спасибо!