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
相关产品推荐
相关产品推荐

