InvalidOperationException:目标必须是布尔值

时间:2016-02-02 11:49:51

标签: c# wpf opacity ivalueconverter

我有UserControl。在其中我有Grid。致Grid我根据另一个控件的值设置了Opacity0 1。设置它我正在使用下一个转换器:

[ValueConversion(typeof(bool), typeof(double))]
public class OpacityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var b = value as bool?;
        if (targetType != typeof(bool) && !b.HasValue)
            throw new InvalidOperationException("The target must be a boolean");
        if (b.HasValue)
        {
            return b.Value ? 1 : 0;
        }
        return 0;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

将bool值转换为Opacity的转换器。对我来说,这一切似乎都是正确的。

但是当我去使用UserControl的页面设计师时,我看到了错误

  

InvalidOperationException:目标必须是布尔值   在SizeStream.WPF.Converters.OpacityConverter.Convert(对象值,类型targetType,对象参数,CultureInfo文化)

当我构建我的项目时,一切都很好。但在设计师 - 而不是。

重启VS 2013无济于事。

为什么会出现这样的问题?感谢

<controls:MultiSelectComboBox Tag="{Binding PanelLoading, Converter={StaticResource InverseConverter}}" SelectedItems="{Binding SelectedBrandsList, Mode=TwoWay}"  Grid.Column="2" Grid.Row="0" x:Name="BrandsFilter" DefaultText="Brand" ItemsSource="{Binding BrandsList}" Style="{StaticResource FiltersDropDowns}"/>

从这个元素我得到Tag值。

<Grid Background="#FF826C83" Name="DropDown" SnapsToDevicePixels="True" MinWidth="{TemplateBinding ActualWidth}" MaxHeight="{TemplateBinding MaxDropDownHeight}" Opacity="{Binding Path=Tag, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}, Converter={StaticResource OpacityConverter}}"> 

这里我使用转换器

答案:

在StackOverflow用户的帮助下,我的最终代码如下:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (targetType != typeof(double))
            throw new InvalidOperationException("The target must be a double");
        if (value is bool)
        {
            return (bool)value ? 1 : 0;
        }
        return 0;
    }

1 个答案:

答案 0 :(得分:1)

if (targetType != typeof(bool) && !b.HasValue)
        throw new InvalidOperationException("The target must be a boolean");

如果您打算从bool转换为double,则必须在上面的代码中针对“double”检查您的目标类型。