获取指定强制转换的c#转换器无效

获取指定强制转换的c#转换器无效,c#,wpf,C#,Wpf,我试图简单地对我的自定义控件进行一些计算。我需要取一个“宽度”值,然后除以转换器参数 以下是装订: <Border x:Name="circleBorder" Grid.Row="0" CornerRadius="{Binding Path=ActualWidth, ElementName=circleGrid}" Width="{Binding Path=ActualWidth, ElementName=circleGrid}" Height="{

我试图简单地对我的自定义控件进行一些计算。我需要取一个“宽度”值,然后除以转换器参数

以下是装订:

<Border x:Name="circleBorder"
     Grid.Row="0"
     CornerRadius="{Binding Path=ActualWidth, ElementName=circleGrid}"
     Width="{Binding Path=ActualWidth, ElementName=circleGrid}"
     Height="{Binding Path=ActualWidth, ElementName=circleGrid}"
     BorderBrush="White"
     BorderThickness="{Binding Converter={StaticResource CalculateBorder}, Path=Width, ElementName=circleBorder, ConverterParameter=30}">
我在
返回((double)值/(double)参数时得到这个错误

指定的强制转换无效


您必须返回System.Windows.Thickness,如下所示

 public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
 {           
    return new Thickness(10,10,10,10);
 }
BorderThickness接受System.Windows.Thickness

转换器参数
给出了
厚度
类的
对象
,因此您需要对其进行转换以匹配您的逻辑

MSDN

public System.Windows.Thickness BorderThickness { get; set; }
System.Windows.Controls.Border的成员

总结: 获取或设置System.Windows.Controls.Border的相对System.Windows.Thickness

返回:
描述System.Windows.Controls.Border边界宽度的System.Windows.Thickness。此属性没有默认值。

必须返回System.Windows.Thickness,如下所示

 public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
 {           
    return new Thickness(10,10,10,10);
 }
BorderThickness接受System.Windows.Thickness

转换器参数
给出了
厚度
类的
对象
,因此您需要对其进行转换以匹配您的逻辑

MSDN

public System.Windows.Thickness BorderThickness { get; set; }
System.Windows.Controls.Border的成员

总结: 获取或设置System.Windows.Controls.Border的相对System.Windows.Thickness

返回:
描述System.Windows.Controls.Border边界宽度的System.Windows.Thickness。此属性没有默认值。

问题是无法取消装箱
参数
,因为在这种情况下
参数
字符串

解决方案是将参数与类一起转换为double

上述代码的问题在于
Convert
被定义为
IValueConverter
Convert
方法。因此,您需要通过添加
System
来指定完整的名称空间。完整表达式如下所示:

var yourDouble = System.Convert.ToDouble(parameter);
向编译器明确说明您要使用
System.Convert



此外,属性
BorderThickness
的类型为
Thickness
。因此,您应该返回一个
Thickness
对象引用,而不是
double

问题在于无法取消对
参数的装箱,因为在这种情况下
参数
是一个
字符串

解决方案是将参数与类一起转换为double

上述代码的问题在于
Convert
被定义为
IValueConverter
Convert
方法。因此,您需要通过添加
System
来指定完整的名称空间。完整表达式如下所示:

var yourDouble = System.Convert.ToDouble(parameter);
向编译器明确说明您要使用
System.Convert



此外,属性
BorderThickness
的类型为
Thickness
。因此,您应该返回一个
Thickness
对象引用,而不是
double

对象参数是一个字符串

返回((双精度)值/Convert.ToDouble(参数));

对象参数是一个字符串

返回((双精度)值/Convert.ToDouble(参数));

听起来好像您的
参数
实际上可能不是双精度的。尝试使用
Convert.ToDouble()
而不是直接强制转换,因为它可以正确处理更多情况。向我们展示什么是CalculateOrder。这是这里缺失的关键信息。证明这一点的最佳方法:不要在
Convert
方法中使用参数,只需将
(double)value
除以2.2。在询问之前,您应该调试这些内容。进行转换时,
参数
中有什么?在转换器上放置一个断点,查看值是否为NaN。听起来好像您的
参数
实际上可能不是一个双精度值。尝试使用
Convert.ToDouble()
而不是直接强制转换,因为它可以正确处理更多情况。向我们展示什么是CalculateOrder。这是这里缺失的关键信息。证明这一点的最佳方法:不要在
Convert
方法中使用参数,只需将
(double)value
除以2.2。在询问之前,您应该调试这些内容。进行转换时,
value
parameter
中有什么内容?在转换器上放置一个断点,查看值是否不在第一个post上方。是否尝试返回厚度?装订接缝要正确。我做了您建议的更改,这是相同的错误
返回新厚度((双)值/(双)参数)您的解决方案指向了实现的另一个问题,但原始错误是由我的回答中提到的cast
(double)参数
中的cast错误引起的。请参阅上面的第一篇文章。您是否尝试返回厚度?装订接缝要正确。我做了您建议的更改,这是相同的错误
返回新厚度((双)值/(双)参数)
您的解决方案指向了实现的另一个问题,但原始错误是由cast
(double)参数
引起的cast错误,如我在回答中所述