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

Silverlight-将ValueConverter添加到自定义控件中的绑定对象,silverlight,binding,controls,Silverlight,Binding,Controls,我正在Silverlight中构建一个自定义控件,扩展TextBox。控件的目的是提供水印逻辑(默认文本,通常用于搜索框)。我设法做到了,当访问Text属性时,如果Text==Watermark,它将返回string.Empty。事实上,你不想把“输入姓名”作为一个相关的值来考虑。当涉及双向数据绑定时,事情变得更加复杂 我创建了一个ValueConverter,它将水印作为参数并返回string.Empty(如果Text==水印,则返回Text)。我希望该控件非常易于使用,因此,如果客户端代码不

我正在Silverlight中构建一个自定义控件,扩展TextBox。控件的目的是提供水印逻辑(默认文本,通常用于搜索框)。我设法做到了,当访问Text属性时,如果Text==Watermark,它将返回string.Empty。事实上,你不想把“输入姓名”作为一个相关的值来考虑。当涉及双向数据绑定时,事情变得更加复杂

我创建了一个ValueConverter,它将水印作为参数并返回string.Empty(如果Text==水印,则返回Text)。我希望该控件非常易于使用,因此,如果客户端代码不必在绑定到Text属性时每次都指定转换器,那就太酷了。相反,转换器将插入与Text属性相关的绑定对象上的自定义控件中

我尝试了以下代码,但它崩溃了,因为绑定对象一旦被分配就无法修改。我在Load()和OnApplyTemplate()事件中尝试了该代码

因此,我需要在正确的时间截获绑定对象(仍然允许修改它)。有什么想法吗

提前感谢,


Thibaut

我还没有尝试过,但Silverlight 4文本框具有水印属性

我还没有试过,但是Silverlight 4文本框有水印属性

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

水印在自定义控件的ControlTemplate中定义。它是文本框中添加的文本块,在焦点上隐藏,如果文本为空则显示。代码更好,如下所示:

  • 无需使用Text属性并在特定条件下对其进行更改,即可将其更改为水印,或将其更改为string.Empty,这样水印文本将永远不会返回(容易出错)
  • 水印文本样式可以直接进行模板绑定(TemplateBinding),因此它非常棒,不需要任何C#代码,客户端将能够自定义水印的外观:颜色、斜体等等
  • 提供新的可能性(图像水印文本框几乎免费)

再见;)

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

水印在自定义控件的ControlTemplate中定义。它是文本框中添加的文本块,在焦点上隐藏,如果文本为空则显示。代码更好,如下所示:

  • 无需使用Text属性并在特定条件下对其进行更改,即可将其更改为水印,或将其更改为string.Empty,这样水印文本将永远不会返回(容易出错)
  • 水印文本样式可以直接进行模板绑定(TemplateBinding),因此它非常棒,不需要任何C#代码,客户端将能够自定义水印的外观:颜色、斜体等等
  • 提供新的可能性(图像水印文本框几乎免费)

再见;)

您不能使用水印属性。。它只在设计阶段有效。。所以只有VS或Blend可以使用此属性<代码>[EditorBrowsable(EditorBrowsableState.Never)]公共对象水印{get{StubHelper.ThrowIfNotInDesignMode();返回base.GetValue(WatermarkProperty);}set{StubHelper.ThrowIfNotInDesignMode();base.SetValue(WatermarkProperty,value);}}您不能使用水印属性。。它只在设计阶段有效。。所以只有VS或Blend可以使用此属性<代码>[EditorBrowsable(EditorBrowsableState.Never)]公共对象水印{get{StubHelper.ThrowIfNotInDesignMode();返回base.GetValue(WatermarkProperty);}set{StubHelper.ThrowIfNotInDesignMode();base.SetValue(WatermarkProperty,value);}}
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);
}