WPF中ItemsControl绑定ObservableCollection后线条不显示问题
问题排查与修复方案
1. Line控件绑定错误(最直接显示异常原因)
查看你的XAML代码,Line控件的终点绑定完全错误:
<Line X1="{Binding CanvasStart.X}" Y1="{Binding CanvasStart.Y}" X2="{Binding CanvasStart.X}" Y2="{Binding CanvasStart.Y}" Stroke="Black" StrokeThickness="3"/>
X2和Y2错误绑定到了CanvasStart,导致线条起点和终点重合,变成了一个点,自然看不到线条。需要改为绑定CanvasEnd:
<Line X1="{Binding CanvasStart.X}" Y1="{Binding CanvasStart.Y}" X2="{Binding CanvasEnd.X}" Y2="{Binding CanvasEnd.Y}" Stroke="Black" StrokeThickness="3"/>
2. CanvasLine类需实现INotifyPropertyChanged接口
虽然你是先调用GetCanvasLines设置坐标,再将实例添加到CanvasLines集合,但WPF数据绑定依赖属性变更通知来确保UI和数据同步。即使是初始赋值,实现该接口能避免后续修改属性时UI不更新的问题,同时保证绑定的可靠性:
using System.ComponentModel; using System.Runtime.CompilerServices; public class CanvasLine : INotifyPropertyChanged { private Point _dxfStart; private Point _dxfEnd; private Point _canvasStart; private Point _canvasEnd; private string _layer; private List<double> _extents; private double _scale; private double _canvasWidth; private double _canvasHeight; public Point DxfStart { get => _dxfStart; set { _dxfStart = value; OnPropertyChanged(); } } public Point DxfEnd { get => _dxfEnd; set { _dxfEnd = value; OnPropertyChanged(); } } public Point CanvasStart { get => _canvasStart; set { _canvasStart = value; OnPropertyChanged(); } } public Point CanvasEnd { get => _canvasEnd; set { _canvasEnd = value; OnPropertyChanged(); } } public string Layer { get => _layer; set { _layer = value; OnPropertyChanged(); } } public List<double> Extents { get => _extents; set { _extents = value; OnPropertyChanged(); } } public double Scale { get => _scale; set { _scale = value; OnPropertyChanged(); } } public double CanvasWidth { get => _canvasWidth; set { _canvasWidth = value; OnPropertyChanged(); } } public double CanvasHeight { get => _canvasHeight; set { _canvasHeight = value; OnPropertyChanged(); } } public CanvasLine(Point dxfStart, Point dxfEnd, string layer) { DxfStart = dxfStart; DxfEnd = dxfEnd; Layer = layer; } public void GetCanvasLines(List<double> extents, double canvasWidth, double canvasHeight) { Extents = extents; CanvasWidth = canvasWidth; CanvasHeight = canvasHeight; CanvasStart = DXFToCanvas.DXFCoordToCanvas(DxfStart, Extents, CanvasWidth, CanvasHeight); CanvasEnd = DXFToCanvas.DXFCoordToCanvas(DxfEnd, Extents, CanvasWidth, CanvasHeight); } public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } }
3. 确认LoadCanvasDXF方法的调用时机
确保LoadCanvasDXF确实被执行,比如在页面加载完成后调用:
public MainPage() { InitializeComponent(); DataContext = this; Loaded += MainPage_Loaded; } private void MainPage_Loaded(object sender, RoutedEventArgs e) { LoadCanvasDXF(); }
4. 验证DataContext绑定有效性
可以通过添加绑定错误提示来确认DataContext是否正常:在ItemsControl的绑定中添加FallbackValue,如果运行时出现绑定错误提示,说明DataContext设置有问题,否则绑定正常:
<ItemsControl ItemsSource="{Binding CanvasLines, FallbackValue={x:Null}}" ...>
修改上述问题后,你的测试坐标应该能正常显示出水平线段,比如第一条线会从(428.89,266.55)延伸到(349.58,266.55)。
内容的提问来源于stack exchange,提问作者HillbillyHarry
相关产品推荐
相关产品推荐

