多触发器和转换器的困惑问题



我有以下转换器:

公共类 反向布尔转换器 : IValue 转换器 { #region IV转换器成员

    public object Convert(object value, Type targetType, object parameter,
        System.Globalization.CultureInfo culture)
    {
        try
        {
            if (targetType != typeof(bool))
                throw new InvalidOperationException("The target must be a boolean");
        }
        catch(Exception ex)
        {
            int x = 1;
        }
        return !(bool)value;
    }
    public object ConvertBack(object value, Type targetType, object parameter,
        System.Globalization.CultureInfo culture)
    {
        throw new NotSupportedException();
    }
    #endregion
}

我正在尝试像这样使用它,以控制基于代码隐藏属性"CanShowResults"的列表视图的 IsVisible 以及页面上的活动指示器:

        <ListView x:Name="listView" BackgroundColor="White" SeparatorColor="#e0e0e0" IsVisible="False">
            <ListView.Triggers>
                <MultiTrigger TargetType="ListView">
                    <MultiTrigger.Conditions>
                        <BindingCondition Binding="{Binding Source={x:Reference retrievingActivity}, Path=IsRunning, Converter={StaticResource boolInvert}}" Value="true" />
                        <BindingCondition Binding="{Binding Path=CanShowResults}" Value="True" />
                    </MultiTrigger.Conditions>
                    <Setter Property="IsVisible" Value="True" />
                </MultiTrigger>
            </ListView.Triggers>
            <ListView.ItemTemplate>

.....

我在转换方法中遇到异常。 我已经搜索了文档,有人看到我做错了什么吗?

targetType 用于指出要将值转换为的类型。而且没有必要把它传递给你的IValueConverter类。它是根据它想要转换为的类型自动设置的。

例如,如果您在标签文本上使用 IValueConverter,则targetType System.String 。您的targetType始终System.Object,因为您在BindingCondition上使用了它。

如果要手动指出类型,可以尝试ConverterParameter

<BindingCondition Binding="{Binding Source={x:Reference retrievingActivity}, Path=IsRunning, Converter={StaticResource boolInvert}, ConverterParameter={x:Type x:Boolean}}" Value="true" />

然后在IValueConverter类中检索它,如下所示:

try
{
    if ((Type)parameter != typeof(bool))
        throw new InvalidOperationException("The target must be a boolean");
}
catch (Exception ex)
{
    int x = 1;
}
return !(bool)value;

此外,我们直接使用了杰森所说的if (value is bool)

相关内容

  • 没有找到相关文章

最新更新