为何我的MultiValueConverter无法正常工作?
WPF MultiValueConverter 类型转换错误排查
错误信息
System.Windows.Markup.XamlParseException HResult=0x80131501 Message='Set property 'System.Windows.Data.Binding.Converter' threw an exception.' Line number '136' and line position '47'. Source=PresentationFramework StackTrace: ...(省略冗长栈跟踪内容) Inner Exception 1: InvalidCastException: Unable to cast object of type 'CADViewer.Converters.ListToPointCollectionConverter' to type 'System.Windows.Data.IValueConverter'.
问题背景
实现了一个IMultiValueConverter,用于接收Point列表、范围值、画布宽高,转换为PointCollection供Polyline的Points属性绑定,但运行时持续抛出上述类型转换错误,疑惑系统为何会将其识别为IValueConverter。
转换器代码
using System; using System.Collections.Generic; using System.Globalization; using System.Windows; using System.Windows.Data; using System.Windows.Media; namespace CADViewer.Converters { public class ListToPointCollectionConverter : IMultiValueConverter { public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) { var points = (List<Point>)values[0]; var extents = (List<double>)values[1]; var canvasWidth = (double)values[2]; var canvasHeight = (double)values[3]; if (points == null) { return null; } var collection = new PointCollection(); foreach (Point point in points) { Point canvasPoint = DXFToCanvas.DXFCoordToCanvas(point, extents, canvasWidth, canvasHeight); collection.Add(canvasPoint); } return collection; } public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) { throw new NotImplementedException(); } } }
关联XAML代码
<Page.Resources> <j:ListToPointCollectionConverter x:Key="ListToPointCollectionConverter"/> <j:CenterConverter x:Key="CenterConverter"/> <Style TargetType="{x:Type TabPanel}"> <Setter Property="Background" Value="Black"/> </Style> </Page.Resources> <Canvas Background="Transparent" ClipToBounds="True" SizeChanged="ViewportSizeChanged" MouseLeftButtonDown="ViewportMouseLeftButtonDown" MouseLeftButtonUp="ViewportMouseLeftButtonUp" MouseMove="ViewportMouseMove" MouseWheel="ViewportMouseWheel" Grid.Row="1" Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center" Width="900" Height="500"> <ItemsControl x:Name="MapPageItemsControl" Width="900" Height="500"> <ItemsControl.ItemsPanel> <ItemsPanelTemplate> <Canvas Background="Transparent" Width="900" Height="500"/> </ItemsPanelTemplate> </ItemsControl.ItemsPanel> <ItemsControl.Resources> <DataTemplate DataType="{x:Type local:CanvasPolyline}"> <Polyline x:Name="polyline" Stroke="Black" StrokeThickness="0.5"> <Polyline.Points> <MultiBinding Converter="{StaticResource ListToPointCollectionConverter}"> <Binding Path="{Binding DxfVerteces}"/> <Binding Path="{Binding Extents}"/> <Binding Path="{Binding CanvasWidth}"/> <Binding Path="{Binding CanvasHeight}"/> </MultiBinding> </Polyline.Points> </Polyline> </DataTemplate> </ItemsControl.Resources> <ItemsControl.RenderTransform> <MatrixTransform x:Name="transform"/> </ItemsControl.RenderTransform> </ItemsControl> </Canvas>
解决方案
1. 修正Binding的Path写法错误
XAML中MultiBinding内部的Binding存在写法错误:Path="{Binding DxfVerteces}"嵌套了多余的{Binding ...}标记扩展,导致WPF错误地将MultiBinding解析为普通Binding。普通Binding要求转换器实现IValueConverter,但你的转换器是IMultiValueConverter,因此抛出类型转换异常。
修正后的MultiBinding代码:
<MultiBinding Converter="{StaticResource ListToPointCollectionConverter}"> <Binding Path="DxfVerteces"/> <Binding Path="Extents"/> <Binding Path="CanvasWidth"/> <Binding Path="CanvasHeight"/> </MultiBinding>
2. 额外验证
确认XAML中已正确引用CADViewer.Converters命名空间(代码中的j:前缀对应该命名空间,确保引用配置无误)。
内容的提问来源于stack exchange,提问作者HillbillyHarry
相关产品推荐
相关产品推荐

