将ValueConverter传递给CustomControl

时间:2014-10-02 15:36:41

标签: wpf custom-controls ivalueconverter

我遇到了问题,我确定发生这种情况是因为我没有按照自己的意愿使用WPF。我将尝试描述我的情况,并感谢任何想法。

我即将创建一个显示数值的CustomControl,并且可以显示此值的验证错误。控件是控件库的一部分,并且不知道有关值或其验证的任何信息,但应将验证错误显示为工具提示。因此我使用默认样式添加触发器:

<Style.Triggers>
    <Trigger Property="Validation.HasError" Value="True">
        <Setter Property="ToolTip"
                Value="{Binding RelativeSource={x:Static RelativeSource.Self},
                                Path=(Validation.Errors).CurrentItem.ErrorContent}" />
    </Trigger>
</Style.Triggers>

我现在要做的是让控件的用户可以在转换器的帮助下转换验证错误。因此,我在自定义控件中添加了DependencyProperty

public IValueConverter LocConverter
{
    get { return (IValueConverter)GetValue(LocConverterProperty); }
    set { SetValue(LocConverterProperty, value); }
}

我试图通过绑定来使用这个转换器:

<Setter Property="ToolTip"
        Value="{Binding RelativeSource={x:Static RelativeSource.Self},
                        Path=(Validation.Errors).CurrentItem.ErrorContent,
                        Converter={Binding LocConverter,
                                           RelativeSource={RelativeSource AncestorType={x:Type MyControl}}}}" />

但这会导致运行时错误,因为我无法使用绑定转换器。

是否有另一种可能性来绑定转换器或想法如何将转换方法传递给控件?

1 个答案:

答案 0 :(得分:1)

通常,应用依赖于两个或多个可能独立更改的值的绑定(在本例中为错误内容和转换器)的最佳方法是使用MultiBinding。您可以编写一个自定义IMultiValueConverter,它接受​​错误内容作为其第一个值,转换器作为其第二个值,然后使用提供的转换器执行实际转换。当错误内容或MultiBinding发生更改时,系统会重新评估LocConverter