Как заменить мишень для переплета (silverlight 4.0) - PullRequest
0 голосов
/ 28 ноября 2011

Описание проблемы: в моем приложении Silverlight (4.0) у меня есть элемент управления TextBox, фон которого связан с некоторым свойством источника.Я создал поведение для элемента управления TextBox.Внутри моего поведения я хочу взять эту привязку и «перенаправить» к другой цели (скажем, к самому поведению).Другими словами, когда свойство источника фоновой привязки изменяется, вместо обновления свойства в элементе управления TextBox я хочу обновить еще одно целевое свойство.Как это сделать?Я попробовал отражение, но оно не разрешено в SL на частных полях ...

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 29 ноября 2011

Вы можете получить существующий Binding, используя FrameworkElement.GetBindingExpression . Вот образец:

FrameworkElement yourControl = null; // the code to get the control goes here
BindingExpression bindingExpression =
    yourControl.GetBindingExpression(TextBox.Background);
Binding binding = bindingExpression.ParentBinding; // it's your binding

Затем создайте новый объект Binding, настройте его свойства (при необходимости измените цель) и используйте SetBinding, чтобы присоединить его.

UPDATE

Теперь об источнике привязки.

Обратите внимание, что свойство Source будет ненулевым, только если вы установите это свойство явно.

Другие опции для источника Binding включают в себя:

  1. определенный элемент: используется, если установлено Binding.ElementName свойство
  2. шаблонное управление: используется, если Binding.RelativeSource установлено на RelativeSource с Mode=RelativeSourceMode.TemplatedParent
  3. контроль цели привязки: используется, если для Binding.RelativeSource установлено значение RelativeSource с Mode=RelativeSourceMode.TemplatedParent
  4. DataContext: если ни Source, ни предыдущие 3 опции не применимы.

Если вы хотите клонировать Binding, вам следует проверить все эти опции.

Однако, если вам просто нужен элемент данных, вам лучше использовать свойство BindingExpression.DataItem, которое должно возвращать фактический элемент данных, являющийся источником привязки.

0 голосов
/ 28 ноября 2011

Я не уверен, почему вы хотите "перенаправить". Это все еще нормально, если текст в текстовом поле изменяется? Если вы пытаетесь выполнить привязку к другому элементу на экране, вы можете использовать привязку элемента, которая произойдет после того, как текстовое поле tb1 потеряет фокус:

<StackPanel>
<TextBox x:Name="tb1" />
<TextBox Text="{Binding ElementName=tb1, Source=Text}" />
</StackPanel>

В поведении вы можете использовать событие TextChanged и захватить его там.

public class TextBoxBehavior : Behavior<TextBox>
{
/// <summary>
/// Called after the Behavior is attached to an AssociatedObject.
/// </summary>
/// <remarks>Override this to hook up functionality to the AssociatedObject.</remarks>
protected override void OnAttached()
{
base.OnAttached();
this.AssociatedObject.TextChanged += new TextChangedEventHandler(AssociatedObject_TextChanged);
}

/// <summary>
/// Called after the Behavior is detached from an AssociatedObject.
/// </summary>
/// <remarks>Override this to hook up functionality to the AssociatedObject.</remarks>
protected override void OnDetaching()
{
base.OnDetaching();
this.AssociatedObject.TextChanged -= new TextChangedEventHandler(AssociatedObject_TextChanged);
}

void AssociatedObject_TextChanged(object sender, TextChangedEventArgs e)
{
if(!string.IsNullOrEmpty(this.AssociatedObject.Text))
{
 string enteredValue = this.AssociatedObject.Text;
// do what you want with the entered value
}

// if you want to reset it.. this.AssociatedObject.Text = string.Empty;
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...