2013-12-13 15 views
0

Я экспериментирую с роботизированной рукой и нечеткой логикой. Моя цель заключается в построении функции членства (простые функции треугольника и трапеции), созданный пользователем. Объект «Окси-плот» находится на расширителе, который расположен на MainWindow. Выбор участка будет, скорее всего, из раскрывающегося или текстового окна.Обновление Oxyplot C# WPF по запросу

К сожалению, я не могу понять, как обновить сюжет с новой информацией. Все примеры выглядят динамичными, основанными на времени. Но мне нужно, чтобы он основывался на потребностях пользователей! Ближайшие примеры, которые я могу найти, - это демо-файлы Refresh и Task, Я думаю.

До сих пор я был в состоянии произвести оригинальный, чистый участок с заголовком и осями, используя следующий синтаксис:

public partial class MainWindow : Window 
{ 

    private PlotModel plotModel; 

    public PlotModel PlotModel 
    { 
     get 
     { 
      return this.plotModel; 
     } 
     set 
     { 
      this.plotModel = value; 
     } 
    } 

    public MainWindow() 
    { 
     InitializeComponent(); 
     this.DataContext = this; 
     this.PlotModel = CreatePlot("mag1"); 
    } 


    private PlotModel CreatePlot(string title) 
    { 
     var pm = new PlotModel(title); 

     return pm; 
    } 

И в XAML

<Window x:Class="FuzzyGripper.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:oxy="clr-namespace:OxyPlot.Wpf;assembly=OxyPlot.Wpf" 
    Title="MainWindow" Height="800" Width="1000" Closing="Window_Closing" Loaded="Window_Loaded"> 

...... A ton of stuff ...... then...... 

<oxy:Plot x:Name="plot1" Model="{Binding PlotModel}"/> 

Проблема возникает, когда я хотите обновить сюжет с чем-то простым, как новый заголовок. Из того, что я могу сказать, OxyPlot может обновляться только тогда, когда объект находится в конструкторе MainWindow. Например, следующий фрагмент кода вызывается после того, как оригинальный сюжет создается (вне MainWindow() {}):

this.plotModel = CreatePlot("Mag2"); 
plot1.RefreshPlot(true); 

Это не работает. Исходный сюжет остается, с названием «Mag1». У меня такое чувство, что я пропустил что-то, связанное с контекстом, в частности - DataContext - но мне не очень нравится этот язык, поэтому я застрял! С учетом сказанного я не полностью продаюсь на Oxyplot. Если есть лучший подход, я готов попробовать. Спасибо за прочтение.

ответ

4

Идея использования PlotModel в OxyPlot заключается в использовании MVVM, поэтому вы не должны использовать Codebehind, чтобы делать то, что вы пытаетесь сделать. Вы должны проверить сначала concept of MVVM что весьма важно для WPF, а затем посмотреть на различные MVVM рамочные, чтобы помочь вам в этом, как Caliburn Micro или MVVM Light

Проблема с кодом, что, когда вы делаете this.plotModel = CreatePlot("Mag2"), вы создавая новый объект PlotModel, WPF затем теряет привязку, которую он имел со старыми объектами. Вы должны уведомить его (внедряя INotifyPropertyChange), что свойство PlotModel изменилось.

Но так или иначе, чтобы изменить заголовок, вы не должны воссоздать целую PlotModel, вы должны просто сделать что-то вроде this.PlotModel.Title = "Mag2".

Кроме того, у самой PlotModel есть метод обновления, лучше назвать это вместо вызова обновления Plot.

Удачи.