InvalidOperationException:目标必须是布尔值
InvalidOperationException: The target must be a boolean
我有UserControl
。我在里面有 Grid
。对于这个 Grid
我根据另一个控件的值设置 Opacity
即 0
或 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: The target must be a boolean
at SizeStream.WPF.Converters.OpacityConverter.Convert(Object value, Type targetType, Object parameter, CultureInfo culture)
当我构建我的项目时,一切都很好。但在设计师中 - 不是。
重启 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}}">
这里我使用转换器
答案:
在 Whosebug 用户的帮助下,我的最终代码如下所示:
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;
}
if (targetType != typeof(bool) && !b.HasValue)
throw new InvalidOperationException("The target must be a boolean");
如果您打算将 bool 转换为 double,则必须根据上述代码中的 "double" 检查您的目标类型。
我有UserControl
。我在里面有 Grid
。对于这个 Grid
我根据另一个控件的值设置 Opacity
即 0
或 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: The target must be a boolean at SizeStream.WPF.Converters.OpacityConverter.Convert(Object value, Type targetType, Object parameter, CultureInfo culture)
当我构建我的项目时,一切都很好。但在设计师中 - 不是。
重启 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}}">
这里我使用转换器
答案:
在 Whosebug 用户的帮助下,我的最终代码如下所示:
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;
}
if (targetType != typeof(bool) && !b.HasValue)
throw new InvalidOperationException("The target must be a boolean");
如果您打算将 bool 转换为 double,则必须根据上述代码中的 "double" 检查您的目标类型。