Silverlight - добавьте ValueConverter к объекту Binding в пользовательском элементе управления - PullRequest
1 голос
/ 23 февраля 2011

Я создаю пользовательский элемент управления в Silverlight, расширяя TextBox.Цель элемента управления - предоставить логику водяного знака (текст по умолчанию, обычно используемый в полях поиска).Мне удалось, что при доступе к свойству Text, он вернет string.Empty, если Text == Watermark.На самом деле, вы не хотите рассматривать что-то вроде «Введите имя здесь» в качестве релевантного значения.Когда дело доходит до привязки данных TwoWay, все становится сложнее.

Я создал ValueConverter, который принимает в качестве параметра водяной знак и возвращает string.Empty, если Text == Watermark, иначе Text.Я хочу, чтобы элемент управления был очень простым в использовании, поэтому было бы здорово, если бы клиентскому коду не приходилось каждый раз указывать этот конвертер при привязке к свойству Text.Вместо этого конвертер будет подключен внутри пользовательского элемента управления к объекту привязки , связанному со свойством Text.

Я попробовал следующий код, но он вылетает, потому что объект привязки не может быть измененкак только он был назначен.Я пробовал этот код в событиях Load () и OnApplyTemplate ().

var watermarkedTextBox = (WatermarkedTextBox)dependencyObject;
var textBindingExpression = watermarkedTextBox.GetBindingExpression(TextProperty);
if (textBindingExpression != null)
{
    var textBinding = textBindingExpression.ParentBinding;
    textBinding.Converter = new WatermarkConverter();
    textBinding.ConverterParameter = watermarkedTextBox.Watermark;
    watermarkedTextBox.SetBinding(TextProperty, textBinding);
}

Так что мне нужно перехватить объект привязки в нужное время (где ему все еще разрешено изменять его).Есть идеи?

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

Тибо

Ответы [ 2 ]

1 голос
/ 25 февраля 2011

Хорошо, обсудили это с коллегами, нашли оптимальное решение.

Водяной знак определяется в ControlTemplate пользовательского элемента управления. Это TextBlock, добавленный в TextBox, скрытый в фокусе, который отображается, если текст пустой. Код намного лучше, как это:

  • Нет необходимости играть со свойством Text и изменять его при определенных условиях, чтобы изменить его на водяной знак или на строковый. Пустой, чтобы текст водяного знака никогда не возвращался (был подвержен ошибкам) ​​
  • Стиль текста водяного знака может быть напрямую связан с шаблоном (TemplateBinding), поэтому здорово, что без кода C # клиент сможет настроить внешний вид водяного знака: цвет, курсив и многое другое
  • Предлагает новые возможности (текстовое поле водяного знака почти бесплатно)

Увидимся;)

0 голосов
/ 23 февраля 2011

Я еще не пробовал, но текстовое поле Silverlight 4 имеет свойство Watermark.

...