Недопустимое исключение приведения в многозначном преобразователе Xamarin /WPF

#wpf #xamarin #xamarin.forms #ivalueconverter #imultivalueconverter

#wpf #xamarin #xamarin.forms #ivalueconverter #imultivalueconverter

Вопрос:

При разработке MultiValueConverter я столкнулся со странной ошибкой.

Я получаю «Недопустимое исключение приведения» в строке:

 int frameSize = (int)values[0] ; // <-- thows InvalidCast Exception
  

Честно говоря, я не могу определить, почему.

 public class SizeConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        if (values == null || values.Length <3 || values[2] == null || values[1] == null || values[0] == null)
            return 0;
        int numItems = (int)values[2];
        int separatorSize = (int)values[1]; 
        int frameSize = (int)values[0] ; // <-- thows InvalidCast Exception
        
        int totalSeparatorSize = (numItems - 1) * separatorSize;
        int remainingArea = frameSize - totalSeparatorSize;
        return remainingArea / numItems;
    }
    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
  

Я проверил полученный массив значений [3] в преобразователе в немедленном окне:

 `{object[3]}
    [0]: 100
    [1]: 2
    [2]: 4`
  

Вот вызывающий код MSTest [TestClass]:

 [TestClass]
public class TestConverters
{
    [DataRow(100, 2, 4)]
    [DataTestMethod]
    public void Test_Piece_Sizing(double frameSize, int separatorSize, int numItems)
    {
        var sizeConverter = new SizeConverter();
        object[] values = new object[] { frameSize, separatorSize, numItems };
        Assert.AreNotEqual(0,sizeConverter.Convert(values, typeof(int), null, System.Globalization.CultureInfo.CurrentCulture));
    }
}
  

==============================================================================

=================== Исправленный C O D E ЯВЛЯЕТСЯ:========================

     public class SizeConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        if (values == null || values.Length <3 || values[2] == null || values[1] == null || values[0] == null)
            return 0;
        int numItems = (int)values[2];
        int separatorSize = (int)values[1]; 
        double frameSize = System.Convert.ToDouble(values[0]) ;
        
        int totalSeparatorSize = (numItems - 1) * separatorSize;
        int remainingArea = System.Convert.ToInt32(frameSize) - totalSeparatorSize;
        return remainingArea / numItems;
    }
    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
  

Ответ №1:

В тестовом примере frameSize является double , а не int . Либо измените его на int , либо приведите к double в вашем Convert методе.

Ответ №2:

Размер фрейма равен двойному.просто приведите к double