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

时间:2013-07-05 14:57:39

标签: c# wpf binding

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

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

我可以想到三种方法来实现这个目标:

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

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

3)使用多重绑定并传递我的表格作为来源,这应该有效但看起来对我来说太过“上帝对象”了。

你怎么看?我错过了一个更清洁/更简单的解决方案吗?

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

2 个答案:

答案 0 :(得分:0)

您可以创建另一个属性TBBackColor,并将文本框BackgroundColor绑定到该属性。 类似的东西:

Public System.Windows.Media.Brush TBBackColor
{
   get
   {
      return (TBText.Length>160)? new SolidColorBrush(Color.Red):  new SolidColorBrush(Color.White);
   }
}

请记住在TBText属性中(如果这是绑定到TextBoxText的属性),您还需要为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}"/>