Добавить точку в привязку к базе данных Polyline PointCollection из другой нити [дубликат]

Я разочарован тем, что в ответе не было предложено решение функции SQL-окна:

SELECT a.id, a.rev, a.contents
  FROM (SELECT id, rev, contents,
               ROW_NUMBER() OVER (PARTITION BY id ORDER BY rev DESC) rank
          FROM YourTable) a
 WHERE a.rank = 1 

Добавлено в SQL-стандарте ANSI / ISO Standard SQL: 2003 и более поздних версиях с ANSI / ISO Standard SQL: 2008, window ( или окна) доступны со всеми основными поставщиками сейчас. Существует множество типов ранговых функций, доступных для решения проблемы связи: RANK, DENSE_RANK, PERSENT_RANK.

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

3 ответа

Кай, чтобы уведомление об изменении распространялось на ваши привязки, вы должны использовать коллекцию, которая реализует change notificaiton, PointCollection этого не делает. Вы можете создать свою собственную коллекцию, но я бы рекомендовал использовать ObservableCollection<T>.

Кроме того, здесь есть аналогичная SO post , которая также затрагивает несколько других вариантов для создания пользовательский интерфейс знает о ваших изменениях.

1
ответ дан Community 27 August 2018 в 01:33
поделиться

Чтобы связать атрибут Polyline Points с вашей моделью просмотра успешно (т. е. обновить его при изменении связанного PointCollection), вам следует избегать изменения PointCollection как коллекции (Clear, Add и т. д.). Polyline не заметит, что даже привязка к ObservableCollection of Points с пользовательским конвертером не поможет.

Вместо этого вы должны рассмотреть свой PointCollection как свойство: установите его с помощью вновь созданного PointCollection и выполните пожар событие NotifyPropertyChanged:

    private PointCollection points = new PointCollection();
    public PointCollection Points 
    {
        get { return points; }
        set
        {
            points = value;
            NotifyPropertyChanged("Points");
        }
    }

    public void SomeUpdateFunc() 
    {
        PointCollection pc = new PointCollection();

        // Do some adding: pc.Add(new Point(x, y)); etc

        this.Points = pc; // set via the setter, so the notification will fire
    }

Теперь полилиния должна быть обновлена ​​должным образом, удачи!

7
ответ дан Marco Hansma 27 August 2018 в 01:33
поделиться

Существует, по крайней мере, один из возможных способов удаления grid.DataContext = this;

Добавить привязка к RelativeSource к самой сетке. В этом случае файл xaml будет выглядеть как

<Window x:Class="WpfApplication2.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" xmlns:my="clr-namespace:WpfApplication2">
<Grid Name="grid" DataContext="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=my:MainWindow, AncestorLevel=1}}">
    <Canvas>
        <Polyline Points="{Binding Points}" Stroke="Red" StrokeThickness="2" />
    </Canvas>
</Grid>

И код позади будет таким же

 using System;
 using System.Collections.Generic;
 using System.Collections.ObjectModel;
 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;

 namespace WpfApplication2
 {
    public partial class MainWindow : Window , INotifyPropertyChanged
    {
        public MainWindow()
        {
            InitializeComponent();

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

        private void NotifyPropertyChanged(String info)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(info));
            }
        }

        public PointCollection Points { get { return _points; } }

        public event PropertyChangedEventHandler PropertyChanged;
        private PointCollection _points = new PointCollection();
        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 };


    }
}
2
ответ дан Mif 27 August 2018 в 01:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: