You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 02:57:33