有没有办法在不在资源中定义ValueConverter的情况下使用它?因为语法非常详细。
答案 0 :(得分:6)
您可以使用MarkupExtension来最小化所需的xaml代码量。例如:
public class MyConverter: MarkupExtension, IValueConverter
{ private static MyConverter _converter;
public object Convert(object value, Type targetType,
object parameter, System.Globalization.CultureInfo culture)
{
// convert and return something
}
public object ConvertBack(object value, Type targetType,
object parameter, System.Globalization.CultureInfo culture)
{
// convert and return something (if needed)
}
public override object ProvideValue(IServiceProvider serviceProvider)
{
if (_converter == null)
_converter = new MyConverter();
return _converter;
}
}
你最终会得到这样的语法:
{Binding Converter={conv:MyConverter}}
这种方法的另一个优点是可以确保所有转换器都是单例。
这个article很好地解释了这个概念并提供了示例代码。
答案 1 :(得分:5)
在转换器中,您可以拥有一个可以在xaml中引用的静态属性或字段。无需添加资源。
public class MyConverter : IValueConverter
{
public static readonly MyConverter Instance = new MyConverter();
... }
在XAML中
<TextBlock Text="{Binding Path=., Converter={x:Static l:MyConverter.Instance}}" />
请注意,这些转换器不应存储任何状态,因为将使用相同的实例。 如果您对公共字段感到满意,只需创建一个静态属性。
虽然这是更好的辩论
答案 2 :(得分:0)
您可以创建一个attach属性来连接绑定并执行转换,但如果唯一的原因是严重性,我建议您不要在代码中添加额外的复杂性。
答案 3 :(得分:0)
你究竟如何声明这些转换器,以至于冗长是一个问题?
<conv:NegatingConverter x:Key="NegatingConverter" />
每个应用程序每个转换器一行。
用法也不详细。
Converter="{StaticResource NegatingConverter}"