如何使用变量后面的代码作为Value Converter中ConverterParameter的输入

时间:2010-12-08 21:04:56

标签: silverlight data-binding silverlight-3.0 valueconverter

我有一个ListBox,我将ItemsSource设置为从WCF服务填充的CollectionViewSource。我在ListBox.ItemTemplate \ DataTemplate中使用值转换器来转换ItemsSource中对象的属性。

这一切都按预期工作,但现在我需要更新转换过程,使得转换后的值仍然基于单个对象属性值,除非另一个属性等于特定值。并且该值在xaml后面的代码中设置,这是在页面构造函数中设置的字段级变量。

为此,我想将字段级变量作为ValueConverter的ConverterParameter传递。我已经尝试了几种主要使用这个this question中的想法的方法,除了我总是在解析xaml时出错(并且app无法加载)。

一个修复可能是在ItemsSource中为对象添加属性,但我真的不想这样做。部分是因为该对象在几个项目中使用,所以我不想改变我......因为我想看看其他方法是否可行。另外我相信wpf有一个MultiValue转换器(可能是SL 4.0),但我在SL 3.0上。

我的猜测是到目前为止我遇到的问题是因为加载,绑定和解析xaml的时间。

所以有几个问题:

  • 可以像我上面描述的那样完成吗?
  • 如果不是什么问题?
  • 如果没有,那么在没有向对象添加属性的情况下会有另一种方式吗?

1 个答案:

答案 0 :(得分:5)

对我来说听起来不像你想在这种情况下使用绑定ConverterParameter。如果我已经正确理解了你在UserControl级别保留了你想要分配给这个参数的单个值,那么所有实例的参数值都是相同的。

相反,我采取的方法是向Converter代码本身添加一个属性。

 public class ExampleConverter : IValueConverter
 {

    public int SpecialValue { get; set; }

    public override object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value != null)
        {
             if (value.Equals(SpecialValue))
                 return "Special!";
             else
                 return value.ToString();
        }
        else
        {
             return null;
        }
    }

    public override object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

现在您已将此转换器添加到UserControl资源: -

<UserControl.Resources>
   <local:ExampleConverter x:Key="conv" SpecialValue="-1" />
</UserControl.Resources>

如果您需要修改UserControl代码中的值,您可以使用: -

((ExampleConverter)Resources["conv"]).SpecialValue = someOtherVariable;