我有一个 ListBox,我在其中将 ItemsSource 设置为从 WCF 服务填充的 CollectionViewSource。我在 ListBox.ItemTemplate\DataTemplate 中使用值转换器来转换 ItemsSource 中对象的属性。
这一切都按预期工作,但现在我需要更新转换过程,以便转换后的值仍然基于单个对象属性值,除非不同的属性等于特定值。该值在 xaml 的代码后面设置,这是在页面构造函数中设置的字段级变量。
为此,我想将字段级变量作为 ValueConverter 的 ConverterParameter 传递。我尝试了几种方法,主要是使用这个 this question 中的想法除了我总是在解析 xaml 时遇到错误(并且应用程序无法加载)。
一个解决方法可能是向 ItemsSource 中的对象添加一个属性,但我真的不想这样做。部分原因是该对象在多个项目中使用,所以我不想更改 i .... 并且因为我想看看其他方法是否可行。我也相信 wpf 有一个多值转换器(可能还有 SL 4.0),但我使用的是 SL 3.0。
我猜到目前为止我遇到的问题是因为 xaml 的加载、绑定(bind)和解析的时间安排。
那么几个问题:
- 这可以按照我上面的描述来完成吗?
- 如果不是,问题是什么?
- 如果不是,是否有另一种不向对象添加属性的方法?
最佳答案
在我看来,您不想在这种情况下使用绑定(bind) 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;
关于silverlight - 如何使用代码隐藏变量作为 ValueConverter 中 ConverterParameter 的输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4392316/