Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
31 / 14 / 5
Регистрация: 19.11.2014
Сообщений: 617
1

Не срабатывают команды

14.07.2017, 08:40. Показов 3588. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте! Использую MVVMLight
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        <StackPanel Grid.Column="0"
                    Grid.Row="1"
                    Orientation="Horizontal"
                    HorizontalAlignment="Left">
            <Button Command="{Binding Path=AddMedicament}"
                    Content="Добавить"
                    Grid.Column="0"
                    Grid.Row="1"
                    Margin="2"
                    Width="100"/>
            <Button Command="{Binding Path=RemoveMedicament}"
                    Content="Удалить"
                    Grid.Column="0"
                    Grid.Row="1"
                    Margin="2"
                    Width="100"/>
        </StackPanel>
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        public RelayCommand AddCommand { get; private set; }
        public RelayCommand RemoveCommand { get; private set; }
 
        public MainViewModel()
        {
            bd = new WorkingWithData();
            AddCommand = new RelayCommand(AddMedicament);
            RemoveCommand = new RelayCommand(RemoveMedicament);
        }
 
        public void AddMedicament()
        {
            
        }
        public void RemoveMedicament()
        {
            bd.RemoveMedicamentFromBase(SelectedMedicament);
        }
Поставил брейкпоинты в методах AddMedicament() и RemoveMedicament() при нажатии на кнопку не срабатывает ни тот, ни другой. Подскажите, в чем проблема?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.07.2017, 08:40
Ответы с готовыми решениями:

Не срабатывают стили для текста, но для фона срабатывают
&lt;form action=&quot;#&quot; method=&quot;post&quot;&gt; &lt;input placeholder=&quot;Введите имя&quot;...

По краткому названию команды и фамилиям ее участников, построить полное название команды
Всем привет) Я тут решил полазить по http://********, что бы немножко потренероваться, и наткнулся...

Файл должен выполнять команды поочередно, но выполняет все команды одновременно
Добрый день! Столкнулся с небольшой проблемой, уверен такие вопросы уже возникали Файл должен...

Реализовать консольную утилиту, принимающую от пользователя команды с параметрами и выполняющую эти команды
Сразу хочу сказать, что меня интересуют не аргументы int main(int argc, *char) ! Пишу...

8
3 / 3 / 4
Регистрация: 29.10.2016
Сообщений: 48
15.07.2017, 13:20 2
Chizel, то что вы написали - все верно, а вот что с датаконтекстом/биндингом/хз. Копайте в сторону что куда биндится. создайте какое либо свойство, проверьте подватывается ли оно в данном месте и т.д.
0
31 / 14 / 5
Регистрация: 19.11.2014
Сообщений: 617
17.07.2017, 08:16  [ТС] 3
Почему то архив не прикрепляется к сообщению. Вот, по ссылке проект, может посмотрит кто-нибудь, что с ним не так? https://drive.google.com/open?... WFINGlEYms
0
HF
1163 / 749 / 181
Регистрация: 09.09.2011
Сообщений: 2,314
Записей в блоге: 2
17.07.2017, 08:53 4
Первая ошибка. Привязка должна идти к командам, а не методам.
C#
1
2
3
            <Button Command="{Binding Path=AddCommand}"
...
            <Button Command="{Binding Path=RemoveCommand}"
1
31 / 14 / 5
Регистрация: 19.11.2014
Сообщений: 617
17.07.2017, 09:02  [ТС] 5
HF, так AddCommand и RemoveCommand это ведь команды
C#
1
2
public RelayCommand AddCommand { get; private set; }
public RelayCommand RemoveCommand { get; private set; }
0
HF
1163 / 749 / 181
Регистрация: 09.09.2011
Сообщений: 2,314
Записей в блоге: 2
17.07.2017, 09:53 6
Лучший ответ Сообщение было отмечено Chizel как решение

Решение

Цитата Сообщение от Chizel Посмотреть сообщение
так AddCommand и RemoveCommand это ведь команды
Верно, а биндинг был к методам. Поменяйте и увидите что команды в основном будут работать.

Я код сейчас смотрю, пока мне не понятно. Но проблема в том что AddView не видит контекст AddViewModel. Видимо я не совсем понимаю как MVVMLight работает или локатор надо правильно настроить.

Добавлено через 27 минут
Ошибка номер 2:
AddViewModel.cs. Это были поля, должны быть свойства. Теперь кнопки тоже работают.
C#
1
2
        public RelayCommand AddMedicamentCommand { get; private set; }
    public RelayCommand CanselCommand { get; private set; }
Добавлено через 12 минут
А теперь ошибки связанные с проектом:

WorkingWithData.cs
1. CSV файл. Формат файла неправильный.
1) Разделитель должен быть ";". И потому что в CSV это принято, и потому что местоположение это наверняка улица, а там "," полно.
2) формат даты неопределён и нет ни парсинга по формату, ни try..catch. Падаем сразу же в любом случае.
3) "
C#
1
ObservableCollection<Medicament> ListMedicaments
" определён почему-то здесь. Вы сделали уже его в MainViewModel, оттуда и контролируйте. Данные когда читаются, они не обязательно должны быть того же типа. Считали, передали их назад во вьюмодель и сконвертировали. Или предайте ссылку на коллекцию в класс ридер/врайтера и достаточно. А сейчас сразу же у вас появилась проблема с обновлением коллекции после изменения данных.

MainViewModel.cs
1) окно то создали
C#
1
AddViewWindow = new AddView();
а толку пока в нём нет. Контекст или не будет связан с MainViewModel или возвращаемся к проблеме с коллекцией, которую надо тогда обновить и сообщить что она обновилась. Один из правильных вариантов такой. Добавить строку
C#
1
AddViewWindow.DataContext = new AddViewModel();
Тогда увидите что данные появились в полях ввода. А до этого всё было пусто.

AddViewModel.xaml
1) Не нужно поля ввода по умолчанию заполнять информацией, которая не должна сохраняться по умолчанию. Так можно насоздавать кучу препаратов с названием "Название лекарства". Лучше форму чуток поменять красиво. Добавить Label. Пример для первой строки:
C#
1
2
3
4
            <Label Target="{Binding ElementName=MedicalName}" >Название лекарства</Label>
            <TextBox Name="MedicalName" Text="{Binding Path=Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                     Margin="5,0,5,10"
                     Height="30"/>
1
31 / 14 / 5
Регистрация: 19.11.2014
Сообщений: 617
17.07.2017, 10:19  [ТС] 7
Цитата Сообщение от HF Посмотреть сообщение
Верно, а биндинг был к методам. Поменяйте и увидите что команды в основном будут работать.
Ага, действительно ступил я. Спасибо за помощь.
Цитата Сообщение от HF Посмотреть сообщение
Я код сейчас смотрю, пока мне не понятно. Но проблема в том что AddView не видит контекст AddViewModel. Видимо я не совсем понимаю как MVVMLight работает или локатор надо правильно настроить.
Приложение еще не дописано, поэтому контекст я не настроил пока. То есть изначально я накидал одно главное окно, начал проверять, а не работают команды. Писал дальше, параллельно пытаясь разобрать в чем причина. За подсказку на счет свойств тоже спасибо, упустил этот момент.

О, тут вообще все разобрали по полочкам, замечательно!

Добавлено через 20 минут
Цитата Сообщение от HF Посмотреть сообщение
1) Разделитель должен быть ";". И потому что в CSV это принято, и потому что местоположение это наверняка улица, а там "," полно.
Исправил. Но местоположение это не улица, а аптечка, либо холодильник, так что тут запятых не будет.
Цитата Сообщение от HF Посмотреть сообщение
формат даты неопределён и нет ни парсинга по формату, ни try..catch. Падаем сразу же в любом случае.
try catch добавить нужно конечно, но зачем определять формат даты? Дату я буду получать с окна AddView, то есть от календаря, вручную дата нигде забиваться не будет. Поэтому и ошибок быть не должно, календарь то ведь всегда в одном виде дату передает.
Цитата Сообщение от HF Посмотреть сообщение
3) "
C#Выделить код
1
ObservableCollection<Medicament> ListMedicaments
" определён почему-то здесь.
Я не могу коллекцию передать по ссылке в модель. Концепция MVVM это запрещает, поэтому коллекция есть в модели, а во вью модели обертка над ней.
Цитата Сообщение от HF Посмотреть сообщение
1) Не нужно поля ввода по умолчанию заполнять информацией, которая не должна сохраняться по умолчанию.
Учту.
0
HF
1163 / 749 / 181
Регистрация: 09.09.2011
Сообщений: 2,314
Записей в блоге: 2
17.07.2017, 11:00 8
Цитата Сообщение от Chizel Посмотреть сообщение
Я не могу коллекцию передать по ссылке в модель. Концепция MVVM это запрещает, поэтому коллекция есть в модели, а во вью модели обертка над ней.
Да вы лучше меня всё знаете. Конечно делайте как задумали. Это я просто столкнулся и показалось чем-то неправильным. Но наверное просто вы ещё не до конца всё согласовали в коде.

Цитата Сообщение от Chizel Посмотреть сообщение
try catch добавить нужно конечно, но зачем определять формат даты? Дату я буду получать с окна AddView, то есть от календаря, вручную дата нигде забиваться не будет. Поэтому и ошибок быть не должно, календарь то ведь всегда в одном виде дату передает.
Так то оно так, но если на будущее закладываться? На разных компьютерах, может быть разный формат. Даже вы сами можете поработать на одном компьютере (с русским регионом), а потом перейти на другой (английский формат дат и цифр)... и все ваши файлы перестанут работать.
Ну и, этот метод может в дальнейшем использоваться и как импортирование сторонних данных. Аптеки или поставщики будут например присылать свои данные. И вам потом разные форматы разгребать придётся.
Я бы сразу формат какой-то определил (импорт через DateTime.Parse) или сделал парсер разных форматов дат (сначала регэксп определяет, потом парсит).

Добавлено через 58 секунд
Цитата Сообщение от Chizel Посмотреть сообщение
Ага, действительно ступил я. Спасибо за помощь.
Поэтому лучше Action методы кнопок делать приватными и тогда легко будет увидеть ошибку.

Добавлено через 5 минут
Цитата Сообщение от Chizel Посмотреть сообщение
Я не могу коллекцию передать по ссылке в модель. Концепция MVVM это запрещает, поэтому коллекция есть в модели, а во вью модели обертка над ней.
Я имел ввиду что можно не коллекцию передавать, а Raw данные, например простой список типа List<Medical>. Вызывать этот класс как контроллер данных со статическими методами (читать, писать, удалять). А во вьюмодели результат уже импортировать в коллекцию.
И ваш и мой вариант могут быть работоспособные. Просто мысли вслух
1
31 / 14 / 5
Регистрация: 19.11.2014
Сообщений: 617
17.07.2017, 11:52  [ТС] 9
Цитата Сообщение от HF Посмотреть сообщение
Так то оно так, но если на будущее закладываться? На разных компьютерах, может быть разный формат. Даже вы сами можете поработать на одном компьютере (с русским регионом), а потом перейти на другой (английский формат дат и цифр)... и все ваши файлы перестанут работать.
Ну и, этот метод может в дальнейшем использоваться и как импортирование сторонних данных. Аптеки или поставщики будут например присылать свои данные. И вам потом разные форматы разгребать придётся.
Я бы сразу формат какой-то определил (импорт через DateTime.Parse) или сделал парсер разных форматов дат (сначала регэксп определяет, потом парсит).
Дельно, переделаю, чтобы была проверка формата дат.
Цитата Сообщение от HF Посмотреть сообщение
Поэтому лучше Action методы кнопок делать приватными и тогда легко будет увидеть ошибку.
Да, так действительно будет лучше, на будущее учту, ну и тут переделаю, конечно же.
0
17.07.2017, 11:52
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.07.2017, 11:52
Помогаю со студенческими работами здесь

После выполнения определённой команды не выполняются последующие команды
Объясните, пожалуйста, почему может останавливаться выполнение второй и далее комманд? cd...

Команды передачи управления (команды условного и безусловного переходов)
Необходимо определить переменные А, В, С как знаковые байтовые переменные. Написать программу...

Вывести результат выполнения команды HELP в текстовый файл так, чтобы у каждой команды был порядковый номер
Всем привет, нужна помощь! Необходимо команду help вывести в текстовый документ, чтобы у каждой...

Вывести на экран команды победителя и команды аутсайдера
В массив Team занесены названия 10 команд футбольного турнира. Введите с клавиатуры данные для...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru