Silverlight - 将ValueConverter添加到自定义控件中的Binding对象

时间:2011-02-22 22:09:43

标签: silverlight binding controls

我正在Silverlight中构建一个自定义控件,扩展了TextBox。控件的目的是提供水印逻辑(默认文本,通常在搜索框中使用)。我设法说,当访问Text属性时,如果Text == Watermark,它将返回string.Empty。实际上,您不希望将“输入此处的名称”视为相关值。当涉及到TwoWay数据绑定时,事情变得更加复杂。

我创建了一个ValueConverter,它将水印作为参数,如果Text == Watermark则返回string.Empty,否则返回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 个答案:

答案 0 :(得分:1)

好吧,与同事讨论过,找到了最佳解决方案。

水印在自定义控件的ControlTemplate中定义。它是TextBox中添加的TextBlock,隐藏在焦点上,如果文本为空则显示。代码要好得多:

  • 无需使用Text属性并在某些条件下更改它以将其更改为水印,或将其更改为string.Empty以便永远不会返回水印文本(容易出错)
  • 水印文字样式可以直接模板绑定(TemplateBinding),所以它很棒,没有任何C#代码,客户端就能自定义水印的外观:颜色,斜体等等
  • 提供新的可能性(图像水印文本框几乎免费)

见到你;)

答案 1 :(得分:0)

我还没有尝试过,但Silverlight 4 Textbox有一个Watermark属性。