使用WPF绑定更改多个属性的最佳方式
本文关键字:属性 最佳 方式 WPF 绑定 使用 | 更新日期: 2023-09-27 18:21:06
我有一个包含文本框和标签的用户控件,标签显示输入文本的长度(带有一些格式)。如果文本长度超过160个字符,我想更改文本框的背景色。
我曾想过通过绑定来实现这一点,但由于要替换的文本包含标签的长度,我不愿意让两个不同的绑定进行相同的计算。我无法成功更改
我可以想出三种方法来实现这一点:
1) 创建一个隐藏标签,所有标签都替换在他的文本中,然后有两个简单的转换器来绑定显示消息长度和更改背景颜色。3转换器对于这样一个基本的任务似乎太多了。
2) 使用text_changed事件来完成工作。这项工作,但在我看来,它不是在WPF中做事的方式。
3) 使用多绑定并将我的表单作为源传递,这应该可以工作,但对我来说太像"上帝对象"了。
你觉得怎么样?我是否缺少更清洁/更简单的解决方案?
欢迎任何建议,提前谢谢。
您可以创建另一个属性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事件。
在这种情况下,使用转换器是个好主意,但不需要多个转换器。相反,我们定义了一个具有多个参数的转换器:
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}"/>