Прямое портирование невозможно, но можем ли мы «смоделировать» это, используя MultiBinding
Имейте в виду, что это очень тесно связанное решение и может не работать, если многие из таких привязок используются на странице...
Два должны иметь ...
- Принимает задержку в миллисекундах для одного элемента
ArrayList
в качестве параметра преобразователя. - У каждой такой отложенной привязки должен быть свой экземпляр параметра преобразователя.
Тестовый XAML выглядит следующим образом ...
<TextBlock xmlns:Collections="clr-namespace:System.Collections;assembly=mscorlib"
xmlns:System="clr-namespace:System;assembly=mscorlib" >
<TextBlock.Resources>
<local:DelayHelper x:Key="DelayHelper"/>
<Collections:ArrayList x:Key="MultiConverterParameter">
<System:Int32>2000</System:Int32>
</Collections:ArrayList>
</TextBlock.Resources>
<TextBlock.Text>
<MultiBinding UpdateSourceTrigger="LostFocus"
Converter="{StaticResource DelayHelper}"
ConverterParameter="{StaticResource MultiConverterParameter}">
<Binding Path="Text" ElementName="MyTextBox" Mode="OneWay" />
<Binding RelativeSource="{RelativeSource Self}"/>
<Binding BindsDirectlyToSource="True"
Source="{x:Static TextBlock.TextProperty}"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
<TextBox x:Name="MyTextBox" Text="Test..."/>
В этом примере aTextBlock
отображает то, что набрано в TextBox
ниже, с задержкой в 2 секунды.TextBox.Text
является основным источником данных.
DelayHelper
- это мультиконвертер, который работает, как показано ниже ...
public class DelayHelper : IMultiValueConverter
{
#region IMultiValueConverter Members
public object Convert(
object[] values,
Type targetType,
object parameter,
System.Globalization.CultureInfo culture)
{
var sourceElement = values[1] as FrameworkElement;
var dp = values[2] as DependencyProperty;
var paramArray = parameter as ArrayList;
var existingValue
= paramArray != null && paramArray.Count == 2
? paramArray[1] : sourceElement.GetValue(dp);
var newValue = values[0];
var bndExp = BindingOperations.GetMultiBindingExpression(sourceElement, dp);
var temp = new DispatcherTimer() { IsEnabled = false };
var dspTimer
= new DispatcherTimer(
new TimeSpan(0,0,0,0, int.Parse(paramArray[0].ToString())),
DispatcherPriority.Background,
new EventHandler(
delegate
{
if (bndExp != null && existingValue != newValue)
{
var array
= bndExp.ParentMultiBinding.ConverterParameter
as ArrayList;
var existingInterval = array[0];
array.Clear();
array.Add(existingInterval);
array.Add(newValue);
bndExp.UpdateTarget();
}
temp.Stop();
}),
sourceElement.Dispatcher);
temp = dspTimer;
dspTimer.Start();
return existingValue;
}
public object[] ConvertBack(
object value,
Type[] targetTypes,
object parameter,
System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
#endregion
}
Таким образом, этот код использует факты, которые
- MultiBinding может принимать целевой элемент пользовательского интерфейса (
TextBlock
) и его свойство зависимости (TextBlock.TextProperty
), которое само по себе является мультисвязанным. - После привязки мультисвязывание не может изменять свои свойствав том числе
ConveterParameter
.Но сам параметр преобразователя может быть эталонным объектом, который поддерживает свою ссылку на протяжении всей привязки, например, ArrayList
. - *
DispatcherTimer
должен остановиться после своего первого Tick
.Следовательно, мы используем переменную temp
очень важно. - Обновления делают 2 прохода конвертера для каждого обновления исходного текста.От этого поведения нет выхода.Это может привести к замедлению, если используется много задержанных привязок.
- Убедитесь, что вы не используете один и тот же параметр преобразователя для нескольких задержанных привязок
Дайте мне знать, еслиэто помогает ...