Непонятная проблема с MultiTrigger и конвертером - PullRequest
0 голосов
/ 10 июня 2019

У меня есть следующий конвертер:

открытый класс InverseBooleanConverter: IValueConverter { #region IValueConverter Members

    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
}

и я пытаюсь использовать его таким образом, чтобы управлять IsVisible списка, основанного на свойстве code-behind "CanShowResults" и индикатора активности на странице:

        <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. Я просмотрел документацию, кто-нибудь видит, что я делаю не так?

1 Ответ

0 голосов
/ 11 июня 2019

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) непосредственно как то, что сказал Джейсон.

...