使用WPF绑定更改多个属性的最佳方式

本文关键字:属性 最佳 方式 WPF 绑定 使用 | 更新日期: 2023-09-27 18:21:06

我有一个包含文本框和标签的用户控件,标签显示输入文本的长度(带有一些格式)。如果文本长度超过160个字符,我想更改文本框的背景色。

我曾想过通过绑定来实现这一点,但由于要替换的文本包含标签的长度,我不愿意让两个不同的绑定进行相同的计算。我无法成功更改

我可以想出三种方法来实现这一点:

1) 创建一个隐藏标签,所有标签都替换在他的文本中,然后有两个简单的转换器来绑定显示消息长度和更改背景颜色。3转换器对于这样一个基本的任务似乎太多了。

2) 使用text_changed事件来完成工作。这项工作,但在我看来,它不是在WPF中做事的方式。

3) 使用多绑定并将我的表单作为源传递,这应该可以工作,但对我来说太像"上帝对象"了。

你觉得怎么样?我是否缺少更清洁/更简单的解决方案?

欢迎任何建议,提前谢谢。

使用WPF绑定更改多个属性的最佳方式

您可以创建另一个属性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}"/>