2015-03-26 6 views
1

Я пытаюсь добавить динамический график OxyPlot, но он не работает.OxyPlot add PlotModel

<Window x:Class="WpfApplication8.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"> 
<Grid > 
    <Grid.RowDefinitions> 
     <RowDefinition Height="20"></RowDefinition> 
     <RowDefinition></RowDefinition> 
    </Grid.RowDefinitions> 
    <Grid.ColumnDefinitions> 
    </Grid.ColumnDefinitions> 
    <ItemsControl ItemsSource="{Binding TheList}" x:Name="MyGrid" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Height="Auto" Grid.Row="1"> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <UniformGrid Rows="{Binding Path=Rows,Mode=TwoWay}" Columns="{Binding Path=Columns,Mode=TwoWay}"></UniformGrid> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
    </ItemsControl> 
    <StackPanel Orientation="Horizontal"> 
     <Button Command="{Binding One}">1</Button> 
     <Button Command="{Binding Four}">4</Button> 
     <Button Command="{Binding Eight}">8</Button> 
    </StackPanel> 
</Grid> 

код выглядеть как это. FourButton и EightButton не работают.

using GalaSoft.MvvmLight.Command; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 
using System.ComponentModel; 
using System.Collections.ObjectModel; 
using OxyPlot.Wpf; 
using OxyPlot; 
namespace WpfApplication8 
{ 
/// <summary> 
/// Interaction logic for MainWindow.xaml 
/// </summary> 
/// 

public partial class MainWindow : Window 
{ 

    public class ViewModelTest : INotifyPropertyChanged 
    { 
     private PlotModel plotModel; 
     public PlotModel PlotModel 
     { 
      get { return plotModel; } 
      set { plotModel = value; NotifyPropertyChanged("PlotModel"); } 
     } 

     private ObservableCollection<PlotModel> theList; 
     public ObservableCollection<PlotModel> TheList 
     { 
      get { return theList; } 
      set { theList = value; NotifyPropertyChanged("TheList"); } 
     } 
     private int rows; 
     public int Rows 
     { 
      get { return rows; } 
      set { rows = value; NotifyPropertyChanged("Rows"); } 
     } 
     private int columns; 
     public int Columns 
     { 
      get { return columns; } 
      set { columns = value; NotifyPropertyChanged("Columns"); } 
     } 
     public ViewModelTest() 
     { 
      PlotModel = new PlotModel(); 
      PlotModel.LegendTitle = "Legend"; 
      PlotModel.LegendOrientation = LegendOrientation.Horizontal; 
      PlotModel.LegendPlacement = LegendPlacement.Outside; 
      PlotModel.LegendPosition = LegendPosition.TopRight; 
      PlotModel.LegendBackground = OxyColor.FromAColor(200, OxyColors.White); 
      PlotModel.LegendBorder = OxyColors.Black; 

      TheList = new ObservableCollection<PlotModel>(); 
      One = new RelayCommand(() => OneButton()); 
      Four = new RelayCommand(() => FourButton()); 
      Eight = new RelayCommand(() => EightButton()); 
     } 
     public ICommand One { get; set; } 
     public ICommand Four { get; set; } 
     public ICommand Eight { get; set; } 


     public event PropertyChangedEventHandler PropertyChanged; 
     private void NotifyPropertyChanged(String info) 
     { 
      if (PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs(info)); 
      } 
     } 
     public void OneButton() 
     { 
      Rows = 1; 
      Columns = 1; 
      TheList.Clear(); 
      for (int i = 0; i < 1; i++) 
      { 
       TheList.Add(PlotModel); 
      } 
     } 
     public void FourButton() 
     { 
      Rows = 2; 
      Columns = 2; 
      TheList.Clear(); 
      for (int i = 0; i < 4; i++) 
      { 
       System.Windows.Controls.Button newBtn = new Button(); 
       newBtn.Content = i.ToString(); 
       newBtn.Name = "Button" + i.ToString(); 
       //TheList.Add(newBtn); 
      } 
     } 
     public void EightButton() 
     { 
      Rows = 2; 
      Columns = 4; 
      TheList.Clear(); 
      for (int i = 0; i < 8; i++) 
      { 
       System.Windows.Controls.Button newBtn = new Button(); 
       newBtn.Content = i.ToString(); 
       newBtn.Name = "Button" + i.ToString(); 
       //TheList.Add(newBtn); 
      } 
     } 
    } 
    public MainWindow() 
    { 

     DataContext = new ViewModelTest(); 
     InitializeComponent(); 

    } 
} 

Почему диаграмма не отображается? Если я добавлю кнопку, все будет хорошо. Я также попытался использовать шаблон, но эффекта не было.

ответ

0

Чтобы отобразить участок нужно 2 вещи:

  • модельной
  • Контрольную, который будет знать, как отобразить эту модель

В своем коде позади я вижу, что вы создаете и заселяют PlotModel. Тем не менее, я не вижу PlotView, который знает, как визуализировать PlotModel, в вашем XAML. Попробуйте добавить следующий или подобный код ItemsControl в XAML (я не проверял, хотя):

<ItemsControl.ItemTemplate> 
    <DataTemplate> 
     <oxy:PlotView Model="{Binding}"/> 
    </DataTemplate> 
</ItemsControl.ItemTemplate> 

Вы должны также определить WAHT является окси например: xmlns:oxy="http://oxyplot.org/wpf

Смотрите также this пример для справки ,

+0

Это не работает, как я хочу. Потому что, если я использую шаблон, как вы поклонились. Это будет только одна диаграмма. Мне нужно создать 1-8 диаграмм в коде. Я не хочу менять шаблон в коде. Основная проблема заключается в добавлении Oxyplot в UniformGrid. – A191919

+0

Да, вы правы, проблема была в PlotView. – A191919