我有一个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的时间。
所以有几个问题:
答案 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;