3

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

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

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

一种解决方法可能是向 ItemsSource 中的对象添加一个属性,但我真的不想这样做。部分是因为该对象在多个项目中使用,所以我不想更改 i .... 并且因为我想看看其他方法是否可行。我也相信 wpf 有一个多值转换器(也许是 SL 4.0),但我在 SL 3.0 上。

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

所以有几个问题:

  • 这可以像我上面描述的那样完成吗?
  • 如果不是,那是什么问题?
  • 如果没有,是否有另一种方法不向对象添加属性?
4

1 回答 1

6

在我看来,您不想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;
于 2010-12-09T09:16:07.020 回答