【问题标题】:Perplexing issue with MultiTrigger and ConverterMultiTrigger 和转换器的令人困惑的问题
【发布时间】:2019-10-25 05:01:54
【问题描述】:

我有以下转换器:

公共类 InverseBooleanConverter : IValueConverter { #region IValueConverter 成员

    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>

。 . . . .

我在 Convert 方法中遇到异常。我搜索了文档,有人看到我做错了吗?

【问题讨论】:

  • “异常”没有帮助。抛出的具体异常是什么?
  • 转换器中的 throw 语句。对不起,我以为那会很清楚。它说,目标类型不是布尔值。
  • 实际传递的类型是什么?
  • System.Object,没有说明对象的种类。很奇怪....
  • 你可以测试if (value is bool)吗?

标签: xamarin binding multitrigger


【解决方案1】:

targetType 用于指出要将值转换为的类型。并且没有必要将它传递给您的 IValueConverter 类。它会根据要将其转换为的类型自动设置。

例如,如果您在标签的文本上使用 IValueConverter,则 targetTypeSystem.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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多