Полилиния с использованием DataBinding и PointCollection для непрерывного обновления


прежде всего я описываю свою цель, которую хочу достичь. Я хочу визуализировать непрерывный поток данных (максимум 1000 значений в секунду, но можно уменьшить). Этот поток данных следует визуализировать в виде диаграммы - точнее, это, помимо прочего, визуализация ЭКГ. Этот поток данных следует визуализировать как ...


прежде всего я описываю свою цель, которую хочу достичь. Я хочу визуализировать непрерывный поток данных (максимум 1000 значений в секунду, но можно уменьшить). Этот поток данных следует визуализировать в виде диаграммы - точнее, это, помимо прочего, визуализация ЭКГ. Этот поток данных следует визуализировать как ...


прежде всего я описываю свою цель, которую хочу достичь. Я хочу визуализировать непрерывный поток данных (максимум 1000 значений в секунду, но можно уменьшить). Этот поток данных следует визуализировать в виде диаграммы - точнее, это, помимо прочего, визуализация ЭКГ. Моя первая идея заключалась в использовании ломаной линии и привязке ее к коллекции точек. Проблема здесь в том, что в пользовательском интерфейсе ничего не отображается. Возможно, это неправильный подход к этой задаче. Приветствуются лучшие идеи. Вот мой код. Сначала вид:

 
<Canvas>
  <Polyline Points="{Binding Points}" Stroke="Red" StrokeThickness="2" />
</Canvas>

Для простоты я использую программный код, хотя я использую шаблон MVVM. Это также причина, по которой я хочу использовать привязку, а не только имя ломаной линии, и добавлять значения.


public partial class MainWindow : Window
{
   private short[] data = new short[]{ 10,30,50,70,90,110,130,150,170,190,210 };
   private short[] data1 = new short[] { 15,14,16,13,17,12,18,11,19,10,24 };

    public MainWindow()
    {
        InitializeComponent();
        for (int i = 0; i < data.Length; i++)
        {
            Points.Add(new Point(data[i], data1[i]));
        }
    }

    private PointCollection _points = new PointCollection();
    public PointCollection Points
    {
        get { return _points; }
    }

}

Я знаю, что это плохой стиль программирования, но для первых тестов мне этого достаточно. Я использую данные массива для значений x и data1 для значений y. Кто-нибудь может сказать мне, что не так с этой привязкой? Что нужно сделать для непрерывного обновления представления при появлении новых значений?
Заранее благодарны за Вашу помощь.

[Обновленная новая версия] Вид:


<Window.Resources>
        <my:PointCollectionConverter x:Key="myPointsConverter"/>
</Window.Resources>
    <Grid Name="grid">
        <Polyline x:Name="ekglineI" Points="{Binding Points, Converter={StaticResource myPointsConverter}}" Stroke="Red" StrokeThickness="2"  />
        <Button Content="Button" Click="button1_Click" />
</Grid>
Код программной части, который рисует ломаную линию при запуске, а затем при нажатии кнопки.

public partial class MainWindow : Window, INotifyPropertyChanged
    {
        private short[] data = new short[] { 10, 30, 50, 70, 90, 110, 130, 150, 170, 190, 210 };
        private short[] data2 = new short[] { 230, 250, 270, 290, 300, 310, 330, 350, 370, 390, 410 };
        private short[] data1 = new short[] { 15, 14, 16, 13, 17, 12, 18, 11, 19, 10, 24 };

public MainWindow() { InitializeComponent(); grid.DataContext = this; for (int i = 0; i < data.Length; i++) { Points.Add(new Point(data[i], data1[i])); } } public event PropertyChangedEventHandler PropertyChanged; private ObservableCollection _points = new ObservableCollection(); public ObservableCollection Points { get { return _points; } }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        for (int i = 0; i < data2.Length; i++)
        {
            Points.Add(new Point(data2[i], data1[i]));
        }
        PropertyChanged(this, new PropertyChangedEventArgs("Points"));
    }

Теперь я хочу избавиться от этой строки: grid.DataContext = this; , чтобы я мог использовать свой MVVM, или есть еще одна возможность?

5
задан Kai Krupka 19 October 2010 в 08:53
поделиться