首页 > 解决方案 > 当窗口构造函数将字符串作为参数时数据绑定失败(OxyPlot,WPF)

问题描述

我需要在将字符串传递给它的构造函数时打开一个新窗口,这似乎排除了新窗口中的一些重要数据绑定。

我的 MainWindow 由一个 TextBox 组成,用户在其中输入一些文本,然后单击一个按钮,打开一个新窗口,使 OxyPlot 显示该文本。这很重要,因为这个单一的用户输入最终将用于打开许多不同的窗口并使用相同的文本制作不同的图。不能让用户在每次打开新窗口时都提供字符串。

带有一些用户输入的 MainWindow

新窗口(“FirstPlotWindow”,因为稍后会实现更多窗口)使用 OxyPlot 在随机位置绘制这些单词。新窗口还有第二个文本框和第二个按钮,用于向绘图添加更多单词。

绘制用户单词的 FirstPlotWindow

我已尽力做到这一点,以便当用户在第二个框中键入一些单词并单击第二个按钮时,更多的单词将添加到情节中。但它不起作用。

这是 FirstPlotWindow 的 XAML 代码:

<Window x:Class="WpfApp2.FirstPlotWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:WpfApp2"
    xmlns:oxy="http://oxyplot.org/wpf"
    mc:Ignorable="d"
    Title="FirstPlotWindow" Height="450" Width="800">
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition/>
        <ColumnDefinition Width="5*"/>
    </Grid.ColumnDefinitions>
    <TextBox x:Name="userInput2" Margin="0,40,0,0" HorizontalAlignment="Center" VerticalAlignment="Top" Width="100" Height="100"/>
    <Button x:Name="changePlotButton" Content="Put new words &#x0a; into plot" HorizontalAlignment="Center" VerticalAlignment="Center" Click="changePlotButton_Click"/>
    <oxy:PlotView x:Name="firstPlotView" Grid.Column="1" Model="{Binding MyModel}"/>
</Grid>

如您所见,我没有在此处设置 DataContext,因为我需要情节模型将原始单词(“你好黑暗我的老朋友”)作为参数,如下所示。这是窗口的代码隐藏:

using System.Collections.Generic;
using System.Windows;

namespace WpfApp2
{
public partial class FirstPlotWindow : Window
{
    private FirstPlotModel modelInWindow;
    public FirstPlotModel ModelInWindow 
    { 
        get { return (FirstPlotModel)DataContext; } 
        set { modelInWindow = value; } 
    }
    public FirstPlotWindow(string inputText)
    {
        InitializeComponent();

        ModelInWindow = new FirstPlotModel(inputText);
        DataContext = modelInWindow;
    }

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

这是 FirstPlotModel 的代码。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using OxyPlot;
using OxyPlot.Annotations;
using OxyPlot.Axes;

namespace WpfApp2
{
public class FirstPlotModel: INotifyPropertyChanged
{
    public PlotModel MyModel { get; set; }
    Random randomizer;

    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)
    {
        randomizer = new Random();
        foreach (string word in wordList)
        {
            MyModel.Annotations.Add(new TextAnnotation
            {
                TextPosition = new DataPoint(
                    randomizer.Next(1, 100),
                    randomizer.Next(0, 100)),
                Text = word
            });
        }
    }

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

我知道输入第二组单词并按下第二个按钮成功改变了ModelInWindow对象中的MyModel属性,因为当我放了一个断点之后changePlotButton_Click我可以看到单词已经添加了。由于 MyModel 属性发生了变化,我相信 OxyPlot 应该更新。但 OxyPlot 不会改变。

我将代码设计为尽可能接近此:OxyPlot WPF not working with Button Click

但是在这里用 XAML 声明 DataContext 似乎是不可能的!请帮忙!!

标签: c#wpfxamldata-bindingoxyplot

解决方案


我无法重现你的代码,所以很难说,但我看不到你更新了情节。这必须手动完成

MyModel.InvalidatePlot(true);


推荐阅读