102 / 86 / 17
Регистрация: 01.04.2017
Сообщений: 795
.NET 4.x

Вызвать событие в другом классе

25.05.2018, 14:59. Показов 3214. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.
Есть класс MainWindow, в нём есть функция AddPreloadedCharts().
Есть статический класс DataManager, в котором хранятся загруженные котировки акций и есть функция LoadQuotes.

LoadQuotes выщывается из MainWindow, эта функция в конце вызывает MainWindow.AddPreloadedCharts().
Ссылка на объект MainWindow хранится в DataManager.

Я хочу сделать так: функция LoadQuotes в конце своей работы должна вызывать событие в классе
MainWindow, где и будет дальнейшая обработка и вызов AddPreloadedCharts(), и ссылку на MainWindow хранить не придётся.

C#
1
2
3
4
5
6
7
 public void AddPreloadedCharts(List<string> quoteNames)
        {
            foreach(string quoteCode in quoteNames)
            {
                this.Dispatcher.BeginInvoke(new Action(() => { AddChart(quoteCode, true); }));
            }
        }

Но для вызова события нужно использовать в MainWindow статическую функцию, в ней вызывать нестатическую AddPreloadedCharts, что невозможно.

Подскажите, как тут быть, что-то я путаюсь.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.05.2018, 14:59
Ответы с готовыми решениями:

Проверка подписки на событие, инициализированное в другом классе
Суть в заголовке, нужны советы как проверить кто подписан на событие. Event инициализирован в другом классе. Создал метод проверки,...

Вызвать нужное событие из динамически создаваемого TextBlock в другом окне из активного окна
Нужно реализовать что-то в духе Toast Notification из Windows 8 Есть главное окно приложения-MainWindow По некоторому событию...

Нужно вызвать через сторонний метод(в другом классе,который в другом файле) метод в форме
public void Print_Inform(int numb1,int znak,int numb2) { switch(znak) { case 1: label2.Text = &quot;+&quot;; break; case...

2
Эксперт .NET
 Аватар для Casper-SC
4433 / 2093 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
25.05.2018, 21:23
Можно без событий
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Windows;
 
namespace PreloadedCharts
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
 
        private async void Window_Loaded(object sender, RoutedEventArgs e)
        {
            List<string> quoteNames = await DataManager.LoadQuotesAsync();
            AddPreloadedCharts(quoteNames);
        }
 
        private void AddPreloadedCharts(List<string> quoteNames)
        {
            foreach (string quoteCode in quoteNames)
            {
                AddChart(quoteCode, true);
            }
        }
 
        private void AddChart(string quoteCode, bool v)
        {
            _listBox.Items.Add(quoteCode);
        }
    }
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
using System.Collections.Generic;
using System.Threading.Tasks;
 
namespace PreloadedCharts
{
    public static class DataManager
    {
        public static Task<List<string>> LoadQuotesAsync()
        {
            return Task.Run(async () =>
            {
                await Task.Delay(1000);
                return new List<string> { "Name1", "Name3", "Name5", "Name7", "Name9" };
            });
        }
    }
}
Добавлено через 12 минут
Вариант 2:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
using System;
using System.Collections.Generic;
using System.Windows;
 
namespace PreloadedCharts
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
 
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            DataManager.QuotesLoaded += DataManager_QuotesLoaded;
            DataManager.LoadQuotesAsync();
        }
 
        private void DataManager_QuotesLoaded(List<string> quoteNames)
        {
            AddPreloadedCharts(quoteNames);
        }
 
        private void AddPreloadedCharts(List<string> quoteNames)
        {
            foreach (string quoteCode in quoteNames)
            {
                AddChart(quoteCode, true);
            }
        }
 
        private void AddChart(string quoteCode, bool v)
        {
            _listBox.Items.Add(quoteCode);
        }
    }
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
 
namespace PreloadedCharts
{
    public static class DataManager
    {
        public static event Action<List<string>> QuotesLoaded;
 
        public static void LoadQuotesAsync()
        {
            var syncContext = SynchronizationContext.Current ?? new SynchronizationContext();
            Task.Run(async () =>
            {
                await Task.Delay(1000);
                OnQuotesLoaded(new List<string> { "Name1", "Name3", "Name5", "Name7", "Name9" },
                    syncContext);
            });
        }
 
        private static void OnQuotesLoaded(List<string> quotes, SynchronizationContext syncContext)
        {
            syncContext.Post(new SendOrPostCallback((unused) =>
            {
                QuotesLoaded?.Invoke(quotes);
            }), null);
        }
    }
}
Добавлено через 3 минуты
Вариант 3:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
using System;
using System.Collections.Generic;
using System.Windows;
 
namespace PreloadedCharts
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
 
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            DataManager.QuotesLoaded += DataManager_QuotesLoaded;
            DataManager.LoadQuotesAsync();
        }
 
        private void DataManager_QuotesLoaded(List<string> quoteNames)
        {
            AddPreloadedCharts(quoteNames);
        }
 
        private void AddPreloadedCharts(List<string> quoteNames)
        {
            foreach (string quoteCode in quoteNames)
            {
                Dispatcher.BeginInvoke(new Action(() =>
                {
                    AddChart(quoteCode, true);
                }));
            }
        }
 
        private void AddChart(string quoteCode, bool v)
        {
            _listBox.Items.Add(quoteCode);
        }
    }
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
 
namespace PreloadedCharts
{
    public static class DataManager
    {
        public static event Action<List<string>> QuotesLoaded;
 
        public static void LoadQuotesAsync()
        {
            Task.Run(async () =>
            {
                await Task.Delay(1000);
                OnQuotesLoaded(new List<string> { "Name1", "Name3", "Name5", "Name7", "Name9" });
            });
        }
 
        private static void OnQuotesLoaded(List<string> quotes)
        {
            QuotesLoaded?.Invoke(quotes);
        }
    }
}
Добавлено через 3 минуты
Хотя вариант 2 плох тем, что там статический класс, по идее его вызывать можно откуда угодно. Если бы это был не статический класс, то можно было бы получать контекст синхронизации в конструкторе класса. Короче, бери или первый или третий вариант.
1
102 / 86 / 17
Регистрация: 01.04.2017
Сообщений: 795
25.05.2018, 23:36  [ТС]
Огромное-огромное спасибо! Выбрал 3 вариант.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.05.2018, 23:36
Помогаю со студенческими работами здесь

Вызвать переменную в другом классе
Подскажите я сделал отдельный класс Version и там сделал public void VersionServer() Как мне в классе Program в static void Main(string...

Вызвать метод класса в другом классе
Подскажите как мне вызвать метод класса в другом классе ?

Вызвать одно событие в другом
Есть событие по закрытию окна this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form1_FormClosing); и...

Вызвать конструктор произвольного класса в другом классе
Здравствуйте! Есть необходимость вызвать конструктор какого-либо класса в методе другого класса. Примерно так: class A{}; class B:...

Вызвать событие одного контрола в другом
Доброго всем времени суток! Пожалуйста подскажите как в событии Text1_MouseMove вызвать событие Combo1_Click. Т.е на форме имеется...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

Новые блоги и статьи
Новая зверюга
volvo 07.11.2025
Подарок на Хеллоуин, и теперь у нас кроме Tuxedo Cat есть еще и щенок далматинца: Хочу еще Симбу взять, очень нравится. . .
Инференс ML моделей в Java: TensorFlow, DL4J и DJL
Javaican 05.11.2025
Python захватил мир машинного обучения - это факт. Но когда дело доходит до продакшена, ситуация не так однозначна. Помню проект в крупном банке три года назад: команда data science натренировала. . .
Mapped types (отображённые типы) в TypeScript
Reangularity 03.11.2025
Mapped types работают как конвейер - берут существующую структуру и производят новую по заданным правилам. Меняют модификаторы свойств, трансформируют значения, фильтруют ключи. Один раз описал. . .
Адаптивная случайность в Unity: динамические вероятности для улучшения игрового дизайна
GameUnited 02.11.2025
Мой знакомый геймдизайнер потерял двадцать процентов активной аудитории за неделю. А виновником оказался обычный генератор псевдослучайных чисел. Казалось бы - добавил в карточную игру случайное. . .
Протоколы в Python
py-thonny 31.10.2025
Традиционная утиная типизация работает просто: попробовал вызвать метод, получилось - отлично, не получилось - упал с ошибкой в рантайме. Протоколы добавляют сюда проверку на этапе статического. . .
C++26: Read-copy-update (RCU)
bytestream 30.10.2025
Прошло почти двадцать лет с тех пор, как производители процессоров отказались от гонки мегагерц и перешли на многоядерность. И знаете что? Мы до сих пор спотыкаемся о те же грабли. Каждый раз, когда. . .
Изображения webp на старых x32 ОС Windows XP и Windows 7
Argus19 30.10.2025
Изображения webp на старых x32 ОС Windows XP и Windows 7 Чтобы решить задачу, использовал интернет: поисковики Google и Yandex, а также подсказки Deep Seek. Как оказалось, чтобы создать. . .
Passkey в ASP.NET Core identity
stackOverflow 29.10.2025
Пароли мертвы. Нет, серьезно - я повторяю это уже лет пять, но теперь впервые за это время чувствую, что это не просто красивые слова. В . NET 10 команда Microsoft внедрила поддержку Passkey прямо в. . .
Последние результаты исследования от команды MCM (октябрь 2025 г.)
Programma_Boinc 29.10.2025
Последние результаты исследования от команды MCM (октябрь 2025 г. ) Поскольку мы продолжаем изучать гены, которые играют ведущую роль в развитии рака, в рамках проекта "Картирование раковых. . .
Мысли в слух
kumehtar 29.10.2025
Обнаружил, что мысли лучше писать короткими фразами. Таким образом внимание читателя успевает охватить всю фразу сразу, за один раз, не соскакивая и не прерываясь. А если писать это длинным текстом,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru