0

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

我正在考虑通过绑定来实现这一点,但由于文本的长度包含要替换的标签,我不愿意让 2 个不同的绑定进行相同的计算。我没有成功改变

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

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

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

3)使用多重绑定并将我的表单作为源传递,这应该可行,但对我来说看起来太多“上帝对象”的方法。

你对那个怎么想的 ?我是否缺少更清洁/更简单的解决方案?

欢迎任何建议,在此先感谢。

4

2 回答 2

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的属性),您也需要引发 propertychanged 事件TBBackColor

于 2013-07-05T15:04:46.797 回答
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}"/>
于 2013-07-05T17:27:41.077 回答