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

WPF OxyPlot:窗口构造函数传入字符串参数时数据绑定失效问题

问题根因

  • 你仅修改了PlotModel内部的Annotations集合,没有触发界面刷新通知:OxyPlot的PlotModel不会在内部元素变更时自动重绘,需要手动触发刷新。
  • FirstPlotModel中的MyModel属性未实现属性变更通知,即使后续替换整个MyModel实例,绑定的PlotView也无法收到变更信号。
  • 你当前FirstPlotWindow中ModelInWindow属性的读写逻辑不一致,存在字段和DataContext不同步的隐患。

修复步骤

1. 修正FirstPlotModel的MyModel属性,添加变更通知

修改属性定义为带通知的实现,同时在修改完图表内容后调用InvalidatePlot触发重绘:

public class FirstPlotModel: INotifyPropertyChanged
{
    // 替换原来的自动属性
    private PlotModel _myModel;
    public PlotModel MyModel
    {
        get => _myModel;
        set
        {
            _myModel = value;
            OnPropertyChanged();
        }
    }
    // Random建议全局初始化,避免短时间调用生成重复随机值
    private Random randomizer = new Random();

    public event PropertyChangedEventHandler PropertyChanged;

    public FirstPlotModel(string inputText)
    {
        MyModel = new PlotModel { Title = "First Plot" };

        MyModel.Axes.Add(new LinearAxis { Position = AxisPosition.Bottom });
        MyModel.Axes.Add(new LinearAxis { Position = AxisPosition.Left });

        List<string> wordList = new List<string>(inputText.Split(" "));
        PopulatePlotWithWords(wordList);
    }

    public void PopulatePlotWithWords(List<string> wordList)
    {
        foreach (string word in wordList)
        {
            MyModel.Annotations.Add(new TextAnnotation
            {
                TextPosition = new DataPoint(
                    randomizer.Next(1, 100),
                    randomizer.Next(0, 100)),
                Text = word
            });
        }
        // 新增这行触发OxyPlot重绘
        MyModel.InvalidatePlot(true);
    }

    private void OnPropertyChanged([CallerMemberName] String propName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propName));
    }
}

2. 修正FirstPlotWindow的ModelInWindow属性逻辑

消除字段和DataContext不同步的隐患:

public partial class FirstPlotWindow : Window
{
    // 简化属性逻辑,直接读写DataContext
    public FirstPlotModel ModelInWindow 
    { 
        get => DataContext as FirstPlotModel; 
        set => DataContext = value; 
    }
    public FirstPlotWindow(string inputText)
    {
        InitializeComponent();
        ModelInWindow = new FirstPlotModel(inputText);
    }

    private void changePlotButton_Click(object sender, RoutedEventArgs e)
    {
        List<string> moreWords = new List<string>(userInput2.Text.Split(" "));
        ModelInWindow.PopulatePlotWithWords(moreWords);
    }
}

修改完成后点击按钮即可正常新增单词到图表中,不需要在XAML中声明DataContext,符合你的参数传入需求。

内容的提问来源于stack exchange,提问作者srshuken

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 07:30:02