如何使用codebehind变量作为ValueConverter中ConverterParameter的输入

Ger*_*ton 3 data-binding silverlight silverlight-3.0 valueconverter

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

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

为此,我想将字段级变量作为ValueConverter的ConverterParameter传递.我已经尝试了几种方法,主要使用这个问题的想法,除了我总是得到一个错误解析xaml(并且应用程序无法加载).

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

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

所以有几个问题:

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

Ant*_*nes 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

<UserControl.Resources>
   <local:ExampleConverter x:Key="conv" SpecialValue="-1" />
</UserControl.Resources>
Run Code Online (Sandbox Code Playgroud)

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

((ExampleConverter)Resources["conv"]).SpecialValue = someOtherVariable;
Run Code Online (Sandbox Code Playgroud)