#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