Нужно рисовать 2D график наиболее простым способом (я думаю - это ломаная линия) с использованием шаблона MVVM в WPF.Я создал несколько классов:
namespace SomeNamespace.Models
{
class Info
{
// public Queue<int> Dots { get; set; }???
public int Point { get; set; }
public int GetLoad()
{
return new Random (100); //Get some data from external class
}
}
}
namespace SomeNamespace.ViewModels
{
public abstract class ViewModelBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}
class InfoViewModel: ViewModelBase
{
//private Queue<Point> _dots = new Queue<Point>();
//public Queue<int> Dots
//{
// get { return _dots; }
// set
// {
// _dots = value;
// OnPropertyChanged("Dots");
// }
//}
private int _point;
public int Point
{
get { return _point; }
set
{
_point = value;
OnPropertyChanged("Point");
}
}
}
class MainViewModel : ViewModelBase
{
// public ObservableCollection<InfoViewModel> InfoList { get; set; }??
public ObservableCollection<int> Points { get; set; }
public MainViewModel(List<Info> info)
{
//InfoList = new ObservableCollection<InfoListViewModel>(info.Select i => new InfoViewModel( i)));???
Points = new ObservableCollection<int>() { 10, 20, 30, 40 }; //just for test
}
}
}
В App.xaml
public partial class App : Application
{
private void OnStartup(object sender, StartupEventArgs e)
{
List<Info> i = new List<Info>()
{
new Info(){ Point = 10 },
new Info(){ Point = 15 },
new Info(){ Point = 20 },
new Info(){ Point = 25 },
new Info(){ Point = 30 },
new Info(){ Point = 35 }
};
MainWindow mainView = new MainWindow();
MainViewModel mainViewModel = new MainViewModel( i);
mainView.DataContext = mainViewModel;
mainView.Show();
}
}
В MainWindow.xaml
<Grid>
<Polyline Name="graph1" Fill="Blue"
Points="{Binding Points}" Stroke="Blue" >
</Polyline>
</Grid>
Но это не работает.
РЕДАКТИРОВАТЬ:
Я написал следующий код, но я не понимаю:
1) Каксвязать <Line X1="{Binding ??}" Y1="{Binding ??}" X2="{Binding ??}" Y2="{Binding ??}" Stroke="Red"/>
с очередью ?
2) Как < Line .../>
может обновляться каждую секунду?Или как ViewModel может обновляться каждую секунду и уведомлять View об этом?
public class Segment
{
public Queue<Point> Dots { get; set; }
}
public class ViewModel:INotifyPropertyChanged
{
private Queue<Segment> _segments;
public Queue<Segment> Segments
{
get { return _segments; }
set
{
_segments = value;
OnPropertyChanged("Segments");
}
}
public ViewModel(Queue<Point> segments)
{
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}
MainWindow mainView = new MainWindow();
Queue<Point> q = Class1.GenerateData(); //Class1.GenerateData() returns Queue<Point>
mainView.DataContext = new ViewModel(q);