如何在C ++ / Cx中使用ConverterParameter?

时间:2012-10-30 07:04:04

标签: visual-c++ windows-runtime converter ivalueconverter c++-cx

我在Visual Studio中启动了一个新的Visual C ++项目,作为模板的一部分,我得到了一个BooleanToVisibilityConverter。这样可以正常工作,但在指定时似乎并不尊重ConverterParameter = Invert。

XAML:

<UserControl.Resources>
    <local:IntToVisibilityConverter x:Name="IntToVisibilityConverter" />
    <common:BooleanToVisibilityConverter x:Name="BoolToVisibilityConverter" />
</UserControl.Resources>

...

<Image Width="24" Height="24" Source="/Assets/DisclosureTriangleDown.png" Visibility="{Binding Disclosed, Converter={StaticResource BoolToVisibilityConverter}}" />
<Image Width="24" Height="24" Source="/Assets/DisclosureTriangleRight.png" Visibility="{Binding Disclosed, Converter={StaticResource BoolToVisibilityConverter}, ConverterParameter=Invert}" />

C ++:

Object^ BooleanToVisibilityConverter::Convert(Object^ value, TypeName targetType, Object^ parameter, String^ language)
{
    (void) targetType;  // Unused parameter
    (void) parameter;   // Unused parameter
    (void) language;    // Unused parameter

    auto boxedBool = dynamic_cast<Box<bool>^>(value);
    auto boolValue = (boxedBool != nullptr && boxedBool->Value);
    return (boolValue ? Visibility::Visible : Visibility::Collapsed);
}

Object^ BooleanToVisibilityConverter::ConvertBack(Object^ value, TypeName targetType, Object^ parameter, String^ language)
{
    (void) targetType;  // Unused parameter
    (void) parameter;   // Unused parameter
    (void) language;    // Unused parameter

    auto visibility = dynamic_cast<Box<Visibility>^>(value);
    return (visibility != nullptr && visibility->Value == Visibility::Visible);
}

我假设我需要对Object^ parameter变量做些什么,但是什么?为什么内置项目模板不处理这种情况呢?

1 个答案:

答案 0 :(得分:1)

转换器参数是一个可选的附加参数,XAML使用者将传递给转换器以指定转换的特定于上下文的详细信息。

作为转换器的作者,您可以自行决定该参数的工作原理(并使用参数为其实现逻辑)。基本上,您需要将Object^参数转换为String^,然后将其与“反转”进行比较(然后将转换函数的行为更改为相应的行为)。

此博文有更多信息;它是关于WPF的,但概念是相同的:http://zamjad.wordpress.com/2010/01/08/passing-parameters-to-value-converter/