Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/58: Рейтинг темы: голосов - 58, средняя оценка - 4.78
22 / 22 / 0
Регистрация: 30.11.2012
Сообщений: 54

Как обработать событие Loaded, используя паттерн MVVM

30.11.2012, 15:46. Показов 11086. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Я пишу приложение, используя паттерн MVVM. Есть представление (MainWindow) и его модель (MainWindowViewModel). Необходимо отреагировать в MainWindowViewModel (в моей модели представления) на событие представления (MainWindow) Loaded.
Действую стандартно.
в App.xaml.cs пишу в событие onStart создание моего представления. DataContext присваиваю модель представления
App.xaml.cs:

C#
1
2
3
4
5
6
7
8
9
     public partial class App
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);
            var mainWindow = new MainWindow {DataContext = new MainWindowViewModel()};
            mainWindow.Show();     
        }
    }
Далее в классе модели представления(MainWindowViewModel) создаю команду WindowLoadedCommand.
MainWindowViewModel.cs:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class MainWindowViewModel
    {
        public MainWindowViewModel()
        {
            WindowLoadedCommand = new Command(arg => WindowLoaded());
        }
 
        public ICommand WindowLoadedCommand { get; private set; }
 
        private void WindowLoaded()
        {
           // Тут какой-либо код, к примеру показать сообщение.
           MessageBox.Show("message");
        }
    }
Класс Command выглядит так:
Command.cs:

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
public class Command : ICommand
    {
        public Command(Action<object> action)
        {
            ExecuteDelegate = action;
        }
 
        public Predicate<object> CanExecuteDelegate { get; set; }
        public Action<object> ExecuteDelegate { get; set; }
 
        public void Execute(object parameter)
        {
            if (ExecuteDelegate != null)
            {
                ExecuteDelegate(parameter);
            }
        }
 
        public bool CanExecute(object parameter)
        {
            if (CanExecuteDelegate != null)
            {
                return CanExecuteDelegate(parameter);
            }
            return true;
        }
 
        public event EventHandler CanExecuteChanged
        {
            add { CommandManager.RequerySuggested += value; }
            remove { CommandManager.RequerySuggested -= value; }
        }
Ну и с помощью библиотеки System.Windows.Interactivity.dll (которую я взял из Blend 4.0) в MainWindow.xaml пытаюсь вызвать эту команду при срабатывание события Loaded.
MainWindow.xaml:

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<Window x:Class="Views.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
        Title="MainWindow" Height="350" Width="525" WindowStyle="None" WindowState="Maximized">
 
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="Initialized" >
            <i:InvokeCommandAction Command="{Binding WindowLoadedCommand}"/>
        </i:EventTrigger>
    </i:Interaction.Triggers> 
    <Grid>
 
    </Grid>
</Window>
Результата нет. Самое интересное, то что Событие Closed таким образом обрабатывается. И если вставить кнопку в представление и привязать ту же команду
MainWindow.xaml:

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<Window x:Class="Views.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
        Title="MainWindow" Height="350" Width="525" WindowStyle="None" WindowState="Maximized">
 
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="Initialized" >
            <i:InvokeCommandAction Command="{Binding WindowLoadedCommand}"/>
        </i:EventTrigger>
    </i:Interaction.Triggers> 
    <Grid>
        <Button Command="{Binding WindowLoadedCommand}"/>
    </Grid>
</Window>
то команда WindowLoadedCommand срабатывает при загрузке приложения (т.е. срабатывает событие). Вопрос: в чем может быть причина такого неадекватного поведения? и как это можно исправить?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.11.2012, 15:46
Ответы с готовыми решениями:

Как обработать событие в textbox с применением паттерна mvvm
Есть у меня textbox у него есть событие FocusableChanged как мне его обработать в класе viewmodel?

Обработка кликов по кнопке в WPF, используя паттерн MVVM
Пытаюсь разобраться с паттерном MVVM в WPF, Вот решил для себя создать простенькое приложение: Эллипс, 8 кнопок разных цветов. При клике...

Обновление одного контроллера из другого ( wpf используя паттерн mvvm)
Как во viewmodel можно делать автоматическое обновление textbox по мере изменения другого контроллера (documentViewer)? То есть, если...

13
43 / 43 / 7
Регистрация: 09.10.2012
Сообщений: 147
01.12.2012, 23:35
По ходу initialized вызывается раньше чем устанавливается datacontext. Попробуй другие события loaded например, оно вроде самое позднее из загрузочных контрола.
0
22 / 22 / 0
Регистрация: 30.11.2012
Сообщений: 54
02.12.2012, 01:10  [ТС]
Цитата Сообщение от Moonshine Посмотреть сообщение
По ходу initialized вызывается раньше чем устанавливается datacontext. Попробуй другие события loaded например, оно вроде самое позднее из загрузочных контрола.
Сори за не очень верный код. Вместо Initializaed, должно быть Loaded. Только оба этих события не срабатывают.
0
43 / 43 / 7
Регистрация: 09.10.2012
Сообщений: 147
02.12.2012, 01:16
Ответ тот же. Да и не всегда обязательно всё в viewmodel писать. усли по старинке намного проще реализуется, то пиши обработчик события
0
22 / 22 / 0
Регистрация: 30.11.2012
Сообщений: 54
02.12.2012, 01:23  [ТС]
Цитата Сообщение от Moonshine Посмотреть сообщение
Ответ тот же. Да и не всегда обязательно всё в viewmodel писать. усли по старинке намного проще реализуется, то пиши обработчик события
Там такая логика, что лучше писать все либо во вьющке, либо в ее модели. А событие Loaded не вызывается раньше Show() моего окна (см. App.xaml.cs). И как тогда объяснить то, что Loaded срабатывает, если во вьющке добавить кнопку и привязать ей команду WindowLoadedCommand? ЗЫ: Очень хотелось бы разобраться в ситуации, поэтому написать обработчик во вьющке не подходит
0
43 / 43 / 7
Регистрация: 09.10.2012
Сообщений: 147
02.12.2012, 02:02
Цитата Сообщение от kashirin Посмотреть сообщение
И как тогда объяснить то, что Loaded срабатывает, если во вьющке добавить кнопку и привязать ей команду WindowLoadedCommand?
Потому, что с дело не в команде. Кнопка исправно генерит событие и команда обрабатывает. Загвоздка именно в loaded событии окна.
0
22 / 22 / 0
Регистрация: 30.11.2012
Сообщений: 54
02.12.2012, 02:08  [ТС]
Цитата Сообщение от Moonshine Посмотреть сообщение
Потому, что с дело не в команде. Кнопка исправно генерит событие и команда обрабатывает. Загвоздка именно в loaded событии окна.
Еще раз. Если вставить кнопку (не нажимать на нее), то срабатывает событие Loaded(именно при загрузке окна). Если оставить кнопку, а убрать EventTrigger, т.е:
XML
1
2
3
4
5
6
7
8
9
10
<Window x:Class="Views.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
        Title="MainWindow" Height="350" Width="525" WindowStyle="None" WindowState="Maximized">
 
    <Grid>
        <Button Command="{Binding WindowLoadedCommand}"/>
    </Grid>
</Window>
то событие Loaded не срабатывает. Если нажать кнопку, то конечно же привязанная к свойству Command команда срабатывает.
0
22 / 22 / 0
Регистрация: 30.11.2012
Сообщений: 54
03.12.2012, 11:16  [ТС]
На данный момент проблема решилась заменой события Loaded на ContentRendered. Но это не решает проблему в общем. Жду предложений.
0
0 / 0 / 0
Регистрация: 30.10.2018
Сообщений: 1
30.10.2018, 17:20
Используй делегаты.
XML
1
2
3
4
5
6
7
8
9
10
<Window x:Class="Views.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
        Title="MainWindow" Height="350" Width="525" WindowStyle="None" WindowState="Maximized">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="Loaded">
            <i:InvokeCommandAction Command="{Binding WindowLoadedCommand}" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
C#
1
2
3
4
5
6
7
8
9
10
11
        public MyViewModel()
        {
            WindowLoadedCommand = new DelegateCommand(WindowLoaded);
        }
 
        private void WindowLoaded()
        {
            throw new NotImplementedException();
        }
 
        public DelegateCommand WindowLoadedCommand { get; set; }
0
 Аватар для Рядовой
1524 / 914 / 329
Регистрация: 17.05.2015
Сообщений: 3,438
31.10.2018, 12:27
kashirin,
1) у меня все работает
Кликните здесь для просмотра всего текста
XML
1
2
3
4
5
 <i:Interaction.Triggers>
        <i:EventTrigger EventName="Loaded">
            <i:InvokeCommandAction Command="{Binding N}" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
C#
1
2
3
4
5
6
7
        private RelayCommand _n;
        public RelayCommand N => _n ?? (_n = new RelayCommand(nnn));
        private void nnn()
        {
            IDialogService dialog = new DefaultDialogService();
            dialog.ShowMessage("rsgf");
        }
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
public class RelayCommand : ICommand
    {
        public event EventHandler CanExecuteChanged
        {
            add { CommandManager.RequerySuggested += value; }
            remove { CommandManager.RequerySuggested -= value; }
        }
        private Action methodToExecute;
        private Func<bool> canExecuteEvaluator;
        public RelayCommand(Action methodToExecute, Func<bool> canExecuteEvaluator)
        {
            this.methodToExecute = methodToExecute;
            this.canExecuteEvaluator = canExecuteEvaluator;
        }
        public RelayCommand(Action methodToExecute)
            : this(methodToExecute, null)
        {
        }
        public bool CanExecute(object parameter)
        {
            if (this.canExecuteEvaluator == null)
            {
                return true;
            }
            else
            {
                bool result = this.canExecuteEvaluator.Invoke();
                return result;
            }
        }
        public void Execute(object parameter)
        {
            this.methodToExecute.Invoke();
        }
    }

2) зачем вам именно это событие?! У вас создание окна и присвоение ему DataContext - одновременные события. Почему просто не вызвать нужный метод в конструкторе вьюмодели?
Цитата Сообщение от shaman80 Посмотреть сообщение
public DelegateCommand WindowLoadedCommand { get; set; }
это вообще к чему тут? откуда автор знает что это за класс такой DelegateCommand?

Добавлено через 3 минуты
тю, тема то 12 года..
0
0 / 0 / 0
Регистрация: 10.05.2019
Сообщений: 16
09.01.2022, 19:10
а актульно
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16150 / 11271 / 2890
Регистрация: 21.04.2018
Сообщений: 33,142
Записей в блоге: 2
09.01.2022, 19:33
Цитата Сообщение от Dandsa Посмотреть сообщение
а актульно
Что актуально?

Советую вам создать новую теме и описать в ней, что вы собственно хотите решить.
Там же можете сослаться на эту тему, указав что использовали отсюда и какие есть проблемы с этим.
0
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
09.01.2022, 21:40
а актульно
Честно говоря, я не знаю что и добавить к теме. Как по-моему ответ уже был дан, просто не отмечен.
0
 Аватар для Andrey-MSK
3360 / 2246 / 388
Регистрация: 14.08.2018
Сообщений: 7,593
Записей в блоге: 4
10.01.2022, 09:23
Цитата Сообщение от Dandsa Посмотреть сообщение
а актульно
В конструкторе VM нужного окна запускайте что вам надо...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.01.2022, 09:23
Помогаю со студенческими работами здесь

Задать ItemsSource для RibbonMenu используя паттерн MVVM и сгенерировать его элементы
Предполагается, что есть некоторая вьюмодель, содержащая коллекцию элементов, которые привязываются к источнику данных для ленточного меню....

Паттерн MVVM или как писать приложения на WPF
Собтвенно вопрос в заголовке. По-скольку WPF поддерживает привязку различным образом наверно это нужно как-то использовать, а не просто как...

Как обработать событие click и событие нажития стрелки?
Допустим есть кнопка влево-вправо для горизонтального листания товаров. Как нужно кроссбраузерно обрабатывать одновременно событие click...

Паттерн MVVM
Подскажите пожалуйста какой-нибудь хороший туториал по MVVM (WPF)

Mvvm паттерн
Форумчане , накидал не большое приложение (кошелек) в универе задавали. Изучаю wpf и mvvm не так давно ,но упорно, кому не трудно не могли...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru