我正在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);
}
所以我需要在正确的时间拦截绑定对象(它仍然允许修改它)。有什么想法吗?
提前致谢,
蒂鲍特
答案 0 :(得分:1)
好吧,与同事讨论过,找到了最佳解决方案。
水印在自定义控件的ControlTemplate中定义。它是TextBox中添加的TextBlock,隐藏在焦点上,如果文本为空则显示。代码要好得多:
见到你;)
答案 1 :(得分:0)
我还没有尝试过,但Silverlight 4 Textbox有一个Watermark属性。