Событие при изменении данных в таблице "Инструменты"
Atom Ответить
02.02.2010


Подскажите пожалуйста как можно получить событие, которое происходит
именно при изменении данных в таблице "Инструменты"
NewSecurities конечно не подходит
Пробовал вот так
Securities.CollectionChanged += (X, Y) =>
{

};
где Securities это коллекция типа ObservableCollection
Но все равно происходит это событие один раз при загрузке данных через
дде,дальше молчит.
Может быть подскажите путь решения?
..вообще это мне надо для того, чтобы проверять некоторые условия на
каждом тике, а через событие NewTrades делать не хочется, т.к. там еще
история генерирует это событие.

Теги:


Спасибо:



Поздравляем именинников: Станислав Гайворонский

7 Ответов
Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 02.02.2010
Ответить


Сразу обозначу определения. ObservableCollection - это специальный
класс-коллекция для визуального отображения. Никакого отношения к
торговым объектам она не имеет. Так уж получилось, что ее можно
использовать для этих средств (очень странно что не вызывается
событие, у меня то как раз в примере все нормально).

Еще хотел сказать. Вы в курсе, что QuikTrader работает в многопоточном
режиме? Это означает, что из событий этого класса напрямую нельзя
обращатся к визуальным контролам? Подробности -

http://sergeyteplyakov.blogspot.com/2009/03/windows-forms-controlinvoke.html.
У меня есть вспогательный классы SynchronizedObservableList и
XamlHelper.SyncXXX (первый использует второе).

Я не делал событие SecuritiesChanged из-за того, что не думал, что кто-
то будет работать на неликвидах. С ликвидами такое событие просто не
нужно. Так как Вас запрос не единственный по поводу такого события, я
его уже добавил в след. версию. Сейчас она на стадии стабилизации,
затем допишу примеры и подправлю документацию. Думаю, будет готова в
конце недели.

Спасибо:

AndreiFX

Фотография
Дата: 03.02.2010
Ответить


Я имел ввиду, что Securities в моем примере(также как и у вас в
примере) - это экземпляр класса ObservableCollection, в которое
заносим данные здесь
this.Trader.NewSecurities += securities =>
{
this.Sync(() => this.Securities.AddRange
(securities));

};
Это событие работает нормально,также данные в таблицу, связанную с
Securities идут корректно, обновляются и т.д., но мне нужно именно
событие, которое генерируется, когда не только появляется новый
элемент в коллекции, а когда происходит какое либо изменение...вообщем
будем ждать следующего релиза.
Спасибо
Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 03.02.2010
Ответить


CollectionChanged должен работать. Именно на основе его контрол Grid
перерисовывает новые значения. Почему Вы решили, что оно не
срабатывает у Вас? Как Вы написали код работы с событием (+
обработчик)?

Спасибо:

AndreiFX

Фотография
Дата: 03.02.2010
Ответить


Securities.CollectionChanged += (X, Y) =>
{

MessageBox.Show("обновление данных");

};

однако месадж бокс выскакивает всего один раз при первом обновлении
данных
Автор топика
Спасибо:

AndreiFX

Фотография
Дата: 03.02.2010
Ответить


Забыл сказать, что этот код я прописал в процедуре при нажатии на
кнопку connect, т.е. там же, где подписываемся на все остальные события
(из Вашего примера)
Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 03.02.2010
Ответить


Сорри, дошло.

Сам класс Security реализует для визуального обновления интерфейс
INotifyPropertyChanged. Именно его и использую виз. компоненты для
обновления данных. Тоесть, Вам нужно найти нужный инструмент и
подписаться у него на событие PropertyChanged. Тоесть:

this.Trader.NewSecurities += securities =>
{
var sec = securities.Find(s => s.Code == "fgfghghgjh");
((INotifyPropertyChanged)sec).PropertyChanged += delegate
{ MessageBox.Show("обновление данных"); };

Спасибо:

AndreiFX

Фотография
Дата: 03.02.2010
Ответить


Вот, то, что нужно!
только не securities.Find , а securities.First работает...
Спасибо!
Автор топика
Спасибо:


Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy