Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1

Mvvm Light. EventToCommand не срабатывает

13.05.2014, 14:38. Показов 2838. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всё работает. кроме этой команды, то есть вью с вью моделью связаны точно правильно

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        <Menu>
            <MenuItem x:Name="menuLines"
                      Header="Линия"
                      ItemsSource="{Binding Lines}">
                <MenuItem.ItemContainerStyle>
                    <Style TargetType="{x:Type MenuItem}">
                        <Setter Property="IsCheckable" Value="True" />
                        <Setter Property="IsChecked" Value="{Binding IsSelected, Mode=TwoWay}" />
                        <Setter Property="Header" Value="{Binding DisplayName}" />
                    </Style>
                </MenuItem.ItemContainerStyle>
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="MouseLeftButtonDown">
                        <Custom:EventToCommand Command="{Binding SelectLineCommand}" CommandParameter="{Binding ElementName=menuLines}" />
                    </i:EventTrigger>
                </i:Interaction.Triggers>
            </MenuItem>
        </Menu>
Во вью модели.
C#
1
2
3
4
5
6
7
8
9
10
11
        public RelayCommand<object> SelectLineCommand
        {
            get
            {
                return _selectLineCommand ?? (_selectLineCommand = new RelayCommand<object>(
                    lineNumber =>
                    {
                        MessageBox.Show("");
                    }));
            }
        }
Добавлено через 28 минут
Та же самая проблема с DataGridTemplateColumn, там в CellEditingTemplate я пытаюсь жать по кнопке вызывать окно с списком и выбирать нужное значение в списке так, чтобы оно изменилось во вью модели привязанной к этой ячейке в DataGrid. Я так понимаю нужно что-то передавать в CommandParameter, иначе не совсем ясно, как получить нужное свойство из вью модели привязанное к этой ячейке...

Добавлено через 2 часа 25 минут
Может я не достаточно подробно описал проблему? Как её решить может кто-то знает?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.05.2014, 14:38
Ответы с готовыми решениями:

Messanger MVVM Light
Здравствуйте! Разбираюсь с MVVM Light. Никак не могу настроить передачу сообщений из одной ViewModel в другую, помогите. ViewModel -...

MVVM Light периодически отваливается
Нормально работает, компилится, а потом разе например на 10-м бабах и Error CS0012 The type 'Object' is defined in an assembly that...

MVVM Light и очистка ресурсов
Собственно вопрос в том, как очистить ресурсы в MVVM Light (уничтожить ViewModel). Гугл утверждает, что нужно использовать...

7
 Аватар для Spawn
995 / 893 / 354
Регистрация: 24.03.2014
Сообщений: 2,381
Записей в блоге: 2
13.05.2014, 14:40
Casper-SC, а можно с тестовым проектиком как в соседней теме?)

Не по теме:

Не сочтите за наглость, просто куда проще так помочь, чем пытаться сымитировать привязки, которые могут быть важны всё-таки.

0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
13.05.2014, 15:00  [ТС]
Цитата Сообщение от Spawn Посмотреть сообщение
Casper-SC, а можно с тестовым проектиком как в соседней теме?)
Хорошо, сейчас заодно с имитирую проблему ещё одну с другой темы и выложу, а то с этим MVVM одни проблемы.
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
13.05.2014, 16:19  [ТС]
Вот набросал проект.

Я там в проекте наставил повсюду #warning вопрос

Но тут отпишусь.

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

2) Как правильно закрывать окно и возвращать результат в свойство привязанное к той ячейке DataGrid, по которой щёлкнули?
Или спрошу по другому тоже самое:
2) Как всё же в DataGrid после щелчка на кнопке в ячейке и выборе в новом окне нового значения изменить свойство во вью модели, к которому привязана эта самая кнопка в DataGrid?

3) Как создав окно сделать выбранным тот элемент, который был в ячейке, по которой мы щёлкали (последняя колонка, там кнопка в каждой ячейке сверху)?

4) И основной вопрос, почему не работает EventToCommand?

Одни вопросы... Если есть время и желание, то исправьте, пожалуйста, все мои косяки, чтобы я знал как делать.
Вложения
Тип файла: rar Wpf_DataGrid.rar (15.9 Кб, 22 просмотров)
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
13.05.2014, 16:49  [ТС]
Самые важные вопросы на данный момент - это 2 и 4, особенно 2 просто горит

Добавлено через 33 секунды
Остальное можно осилить разными путями, хотя хотелось бы нормально делать
0
 Аватар для Spawn
995 / 893 / 354
Регистрация: 24.03.2014
Сообщений: 2,381
Записей в блоге: 2
13.05.2014, 17:18
Пока мельком глянул, что касается EventToCommand, то тут ситуация как и с ItemsSource в DataGridComboBoxColumn, неверный контекст. У Вас же команда находится в MainViewModel, а для текущей привязки должна быть в Employee.

Что касается окон, ну, они изначально не вписывались в паттерн MVVM, Messenger лишь способ предложенный в Light реализации. Вот это почитайте про него, там с PropertyChangedMessage пример хороший.

Как по мне, так проще хоть синглтоном пользоваться, если второе окно не особо наворочено, ну и, конечно, избегать других окон, пересмотрев редактор, в крайнем случае в Popup уйти.
1
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
13.05.2014, 19:32  [ТС]
Цитата Сообщение от Spawn Посмотреть сообщение
Пока мельком глянул, что касается EventToCommand, то тут ситуация как и с ItemsSource в DataGridComboBoxColumn, неверный контекст.
И правда, спасибо, буду внимательнее стараться смотреть, что там к чему биндится.

Добавлено через 1 минуту
Цитата Сообщение от Spawn Посмотреть сообщение
Как по мне, так проще хоть синглтоном пользоваться, если второе окно не особо наворочено, ну и, конечно, избегать других окон, пересмотрев редактор, в крайнем случае в Popup уйти.
Даже не знаю, нужно будет попробовать, конечно, но сомневаюсь, что что-то из этого выйдет
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
09.10.2014, 11:47  [ТС]
Цитата Сообщение от Spawn Посмотреть сообщение
Что касается окон, ну, они изначально не вписывались в паттерн MVVM
Цитата Сообщение от Spawn Посмотреть сообщение
ну и, конечно, избегать других окон, пересмотрев редактор, в крайнем случае в Popup уйти
Всё, я написал один класс, и создал в каждой вью модели свойство с типом этого класса (для вью моделей, что являются вью моделями для окон, контролов возможно каких-то, но не для всех вообще вью моделей).

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

В общем, стало офигенно удобно взаимодействовать с окнами таким способом при этом ничего о них не зная в коде вью моделей.

Так это выглядит:
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
using GalaSoft.MvvmLight.Command;
 
namespace BSU.Controls.Recipes.Editor.ViewModel
{
    public class RecipesEditorViewModel : CollectionSupportedWorkspace<RecipeViewModel>, IApplingSettingsSupported<RecipeViewModel>
    {
        public RelayCommand<Tuple<RecipeViewModel, CategoryViewModel>> OpenCategorySelector
        {
            get
            {
                return _openCategorySelector ?? (_openCategorySelector = new RelayCommand<Tuple<RecipeViewModel, CategoryViewModel>>(
                    (tuple) =>
                    {
                        CategoryViewModel category = tuple.Item2;
                        var selector = new CategoryEditorViewModel();
                        selector.CurrentUser = CurrentUser;
                        selector.Title = "Выберите категорию";
                        selector.LoadDataAsync(category.Id);
 
                        WindowsContainer.OpenDialog<CategorySelectorDialog>(selector, this);
 
                        if (selector.DialogResult)
                        {
                            RecipeViewModel recipe = tuple.Item1;
                            if (selector.SelectedItem != null)
                            {
                                recipe.Category = selector.SelectedItem;
                            }
                        }
                    }));
            }
        }
 
        public RelayCommand OpenCategoryEditor
        {
            get
            {
                return _openCategoryEditor ?? (_openCategoryEditor = new RelayCommand(
                    () =>
                    {
                        var editor = new CategoryEditorViewModel();
                        editor.LoadDataAsync();
                        editor.CurrentUser = CurrentUser;
                        WindowsContainer.OpenDialog<CategoryEditorWindow>(editor, this);
                    }));
            }
        }
 
        public void OpenComponentEditor(RecipeViewModel recipe, RecipeStructureViewModel recipeStructure,
    RecipesEditorViewModel recipeEditor)
        {
            if (WindowsContainer == null)
            {
                throw new ArgumentNullException("Container");
            }
 
            var viewModel = new ComponentEditorViewModel();
 
            //------
 
            WindowsContainer.OpenDialog<ComponentsEditorWindow>(viewModel, this);
        }
    }
}

Я что тему то вообще поднял, я просто похожий вопрос задал и тут же наткнулся на очевидный ответ. Хотя часто в XAML это вообще не очевидно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.10.2014, 11:47
Помогаю со студенческими работами здесь

MVVM Light и оповещения об изменениях модели
В общем есть модель private int _id; private int _contrId; private double _course; public int Id...

MVVM Light генерация контролла пользователем
Здравствуйте. Стоит задача сделать так чтобы при клике на &quot;+&quot; добавлялась группа элементов (2 TimePiker (Использую WPF Toolkit)) . ...

Как в MVVM Light установить шаблоны проектов?
После установки GalaSoft.MvvmLight.4.1.24.0.msi в 2012 студии нет шаблонов проектов. Как их поставить? В: &quot;Сервис&quot; -...

Реализация команд в wpf на mvvm light toolkit
Здравствуйте. Подскажите, пожалуйста, как можно реализовать команды в wpf на mvvm light toolkit? Желательно с примерами кода или...

Доступ к свойствам из другой ViewModel [MVVM Light]
Здравствуйте! Как получить доступ к свойствам одной ViewModel из другой ViewModel? Использую MVVM Light. Долго гуглил, нашел, что нужно...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru