我有一个包含文本框和标签的用户控件,标签显示输入文本的长度(带有一些格式)。如果文本长度超过160个字符,我想更改文本框的背景颜色。
我正在考虑使用绑定来实现这一点,但由于文本的长度包含要替换的标记,因此我不愿意使用2种不同的绑定来进行相同的计算。 我没有成功改变
我可以想到三种方法来实现这个目标:
1)创建一个隐藏的标签,在其文本中替换所有标签,然后有两个简单的转换器来绑定显示消息长度并更改背景颜色。对于这样一个基本任务的3转换器对我来说似乎太过分了。
2)使用text_changed事件来完成工作。这项工作,但在我看来它不是在WPF中做事的方式。
3)使用多重绑定并传递我的表格作为来源,这应该有效但看起来对我来说太过“上帝对象”了。
你怎么看?我错过了一个更清洁/更简单的解决方案吗?
欢迎任何建议,提前致谢。
答案 0 :(得分:0)
您可以创建另一个属性TBBackColor
,并将文本框BackgroundColor
绑定到该属性。
类似的东西:
Public System.Windows.Media.Brush TBBackColor
{
get
{
return (TBText.Length>160)? new SolidColorBrush(Color.Red): new SolidColorBrush(Color.White);
}
}
请记住在TBText
属性中(如果这是绑定到TextBox
:Text
的属性),您还需要为TBBackColor
提升propertychanged事件。
答案 1 :(得分:0)
在这种情况下使用转换器是一个好主意,但您不需要多个转换器。相反,我们定义一个具有多个参数的转换器:
public class TextBoxValueConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value == null || string.IsNullOrEmpty(parameter as string))
throw new ArgumentException("Invalid arguments specified for the converter.");
switch (parameter.ToString())
{
case "labelText":
return string.Format("There are {0} characters in the TextBox.", ((string)value).Count());
case "backgroundColor":
return ((string)value).Count() > 20 ? Brushes.SkyBlue : Brushes.White;
default:
throw new ArgumentException("Invalid paramater specified for the converter.");
}
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
然后在你的XAML中你就像这样使用它:
<TextBox Name="textBox" Background="{Binding RelativeSource={RelativeSource Self}, Path=Text, Converter={StaticResource converter}, ConverterParameter=backgroundColor}"/>
<Label Content="{Binding ElementName=textBox, Path=Text, Converter={StaticResource converter}, ConverterParameter=labelText}"/>