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

Как отправить данные из одного VM в другой?

23.11.2022, 18:40. Показов 3114. Ответов 56
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
У меня есть на Главном окне (Окно1) treeView, в нем разделы и подразделы (Компании и Отделы).
При выборе Компании на форме появляется кнока, открывающая окно добавления Отдела (Окно2) (в коллекцию Отделы выбранной Компании).
Окно2 и его VM ничего не знает о компании, в которую добавляется отдел.
Я могу бы, например, из VM Окна2 вызвать метод модели приложения, куда бы передал созданный объект, модель бы залезла в VM Окна1 (тоже возбудила бы какое-то событие), получила бы отуда выбранную компанию и в нее сохранила бы созданный объект. Получается довольно запутанно.
Это хорошая идея?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.11.2022, 18:40
Ответы с готовыми решениями:

Как отправить файл с одного пк на другой. Не получить из внешнего хранилища, а именно отправить с одного на другой
Привет всем. У меня тут возникла идея сделать одну программку и в ней будет функция отправки небольших файлов. Я подумал что можно...

Как отправить данные взятые с одного сайта на другой?
Допустим я получил данные с помощью парсинга из одного сайта, и мне нужно загрузить эти данные на другой сайт. На этом сайте есть редактор...

Как можно отправить данные с одного сайта на другой с jQuery
Кто сможет подсказать как эту задачу решить Помогите найти решение как можно сделать передачу данных нужно передать с одного сайта на...

56
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16152 / 11273 / 2890
Регистрация: 21.04.2018
Сообщений: 33,147
Записей в блоге: 2
24.11.2022, 11:37
Студворк — интернет-сервис помощи студентам
У мутабельных свойств VM должно быть уведомление об изменении.
С учётом BaseInpc:
C#
54
55
        private Company _selectedCompany;
        public Company SelectedCompany { get => _selectedCompany; set => Set(ref _selectedCompany, value); }
Добавлено через 2 минуты
C#
1
CompaniesContext
зачем публичное свойство, да, ещё и мутабельное?
Должно быть приватное поле только для чтения:
C#
23
        private readonly CompaniesContext compainiesDb = new ();
0
4 / 4 / 0
Регистрация: 01.11.2013
Сообщений: 216
24.11.2022, 11:47  [ТС]
Цитата Сообщение от Vanka03 Посмотреть сообщение
Я правильно понял, что раз вы задаете для AddPersonWindow тот же DataContex, что и для вызывающего окна, то у вас, получается, одна VM на оба окна, да? Не обратил на это внимания, когда Вы демонстрировали в прошлый раз, довольно неожиданно.
Развивая эту тему - все свойства для привязки, команды и т.д. дилога таким образом будут находиться в VM вызываюшего окна?

Добавлено через 1 минуту
Цитата Сообщение от Элд Хасп Посмотреть сообщение
зачем публичное свойство, да, ещё и мутабельное?
Должно быть приватное поле только для чтения:
Ну потому что один сверх-разум понаделал VMов для каждого диалога, и в каждом ему нужен был DbContext
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16152 / 11273 / 2890
Регистрация: 21.04.2018
Сообщений: 33,147
Записей в блоге: 2
24.11.2022, 12:06
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Используйте, хотя бы, BaseInpc отсюда: Простые реализации для тем на форуме
Только замените метод на реализацию отсюда: Метод Set должен быть таким.

Добавлено через 5 минут
C#
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
        private object _selectedItem;
 
        public object SelectedItem
        {
            get => _selectedItem;
            set
            {
                if (Set(ref _selectedItem, value))
                {
                    switch (value)
                    {
                        case Company company: SelectedCompany = company; break;
                        case Department department: SelectedCompany = department.Company; break;
                        default: SelectedCompany = null; break;
                    }
                }
            }
        }
 
        private Company _selectedCompany;
        public Company SelectedCompany { get => _selectedCompany; private set => Set(ref _selectedCompany, value); }
Добавлено через 59 секунд
XML
39
        <DataGrid .... ItemsSource="{Binding SelectedCompany.Departments}">
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16152 / 11273 / 2890
Регистрация: 21.04.2018
Сообщений: 33,147
Записей в блоге: 2
24.11.2022, 12:07
Добавлено через 3 минуты
Цитата Сообщение от Vanka03 Посмотреть сообщение
Вам нужен файл *.db?
Нужен, если у вас не реализован Code First.

Цитата Сообщение от Vanka03 Посмотреть сообщение
Если да, то мне нужно папку Debug из gitignore убрать?
Нет.
Файл БД нужно включить в проект в корень или какую-то вложенную папку.
Указать в его свойствах "Содержание" и "Копировать ...".

Тогда при сборке он будет сам автоматически закидываться в папку сборки.
0
4 / 4 / 0
Регистрация: 01.11.2013
Сообщений: 216
24.11.2022, 12:09  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
<DataGrid .... ItemsSource="{Binding SelectedCompany.Departments}">
Нет, погодите, мне департаменты не нужно отображать в DataGrid, они уже есть в treeview, мне в DataGrid нужно отобразить название выбранной компании и другие ее свойства.

Добавлено через 1 минуту
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Нужен, если у вас не реализован Code First.
Реализован. Я запушил изменения.

Что-то я не могу найти data provider для SQLite in Visual Studio, вы не сталкивались с таким? ОЧень удобно смотреть еще и базу параллельно.
0
 Аватар для Andrey-MSK
3368 / 2254 / 388
Регистрация: 14.08.2018
Сообщений: 7,631
Записей в блоге: 4
24.11.2022, 12:14
Цитата Сообщение от Vanka03 Посмотреть сообщение
Совершенно верно, в DataGrid отображаются поля выбранной компании: страна, год основания и т.д.
Не верно, такие данные можно просто отобразить в наборе из TextBlock. В DataGrid отображаются табличные данные, примеры я вам выше называл...
1
4 / 4 / 0
Регистрация: 01.11.2013
Сообщений: 216
24.11.2022, 12:20  [ТС]
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Не верно, такие данные можно просто отобразить в наборе из TextBlock
Но разве это не сложнее? Представьте, что у объекта 15 полей? Тогда придется для каждого делать TextBlock. Я из такой логики исходил.
Выглядит вот так:
Миниатюры
Как отправить данные из одного VM в другой?  
0
 Аватар для Andrey-MSK
3368 / 2254 / 388
Регистрация: 14.08.2018
Сообщений: 7,631
Записей в блоге: 4
24.11.2022, 12:29
Vanka03, Вот такую компоновку делают в вашем случае - Создание простого приложения для обработки данных с помощью WPF и Entity Framework 6. Вверху данные по компании, внизу, в таблице, заказы, продажи и т.д.
1
4 / 4 / 0
Регистрация: 01.11.2013
Сообщений: 216
24.11.2022, 12:39  [ТС]
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Вот такую компоновку делают в вашем случае
Оказывается, всю компановку можно создать автоматически. О, сколько нам открытий чудных...
0
 Аватар для Andrey-MSK
3368 / 2254 / 388
Регистрация: 14.08.2018
Сообщений: 7,631
Записей в блоге: 4
24.11.2022, 12:44
Цитата Сообщение от Vanka03 Посмотреть сообщение
можно создать автоматически
Можно, только это будет не правильно Когда повторите что там написано (автоматический способ), обратите внимание на значения Margin в элементах...
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16152 / 11273 / 2890
Регистрация: 21.04.2018
Сообщений: 33,147
Записей в блоге: 2
24.11.2022, 12:47
Цитата Сообщение от Vanka03 Посмотреть сообщение
Насколько я понимаю, EF сам вам базу по моделям поднимет,
Нет.
Для этого нужен Code First.

Цитата Сообщение от Vanka03 Посмотреть сообщение
но там ничего не будет, правда.
Это зависит от кода инициализации БД в DbContext.

Чтобы не заморачиваться вопросами ADO просто образцовый начальный файл БД включите в проект, как описал выше.

Добавлено через 1 минуту
Цитата Сообщение от Vanka03 Посмотреть сообщение
мне в DataGrid нужно отобразить название выбранной компании и другие ее свойства.
Чаво?
А для чего тогда DataGrid?
Чтобы не парсить свойтва?
Создайте свой UserConrrol для этого.

Добавлено через 1 минуту
Цитата Сообщение от Vanka03 Посмотреть сообщение
Что-то я не могу найти data provider для SQLite in Visual Studio
Я не шибко по БД могу дать советы.
0
 Аватар для Andrey-MSK
3368 / 2254 / 388
Регистрация: 14.08.2018
Сообщений: 7,631
Записей в блоге: 4
24.11.2022, 12:51
Vanka03, Microsoft.Data.Sqlite -> картинка
Миниатюры
Как отправить данные из одного VM в другой?  
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16152 / 11273 / 2890
Регистрация: 21.04.2018
Сообщений: 33,147
Записей в блоге: 2
24.11.2022, 13:09
Цитата Сообщение от Vanka03 Посмотреть сообщение
Но разве это не сложнее? Представьте, что у объекта 15 полей? Тогда придется для каждого делать TextBlock.
Придётся.

Можно и какое-то типовое решение применить.

Вот здесь есть моя реализация: https://stackoverflow.com/a/74288450/13349759
Там же в теме есть ссылка на репозиторий с исходниками.
Правда, не могу сказать публичный или частный он - не я его владелец.

Но суть даже не в самом Представлении.
Если вам удобнее DataGrid - ради бога.
Но причём здесь VM?
В VM свойство всё равно должно быть для сущности, а не их коллекции.

Если вам понадобилось в Представлении из сущности создать одноэлементную коллекцию, то для этого нужно было использовать конвертер.
Например такой: ToArrayConverter.

Добавлено через 2 минуты
Цитата Сообщение от Vanka03 Посмотреть сообщение
компоновку можно создать автоматически
Это скорее "рыба", которую потом надо изрядно поправить "ручками".

Добавлено через 2 минуты
Цитата Сообщение от Vanka03 Посмотреть сообщение
Развивая эту тему - все свойства для привязки, команды и т.д. дилога таким образом будут находиться в VM вызываюшего окна?
В простом случае - да.
В сложных может несколько VM, дочерние и вложенные VM, какие-то слубы-сервисы, в View прокси, вспомогательные типы, контейнеры, оболочки, контролы и многое другое.

Добавлено через 5 минут
Цитата Сообщение от Vanka03 Посмотреть сообщение
Ну потому что один сверх-разум понаделал VMов для каждого диалога, и в каждом ему нужен был DbContext
Для этого нужно передавать зависимость.
Публичное свойство один способов создания зависимости, но в данном случае неподходящий.
DbContext имеет "историю". То есть его состояние зависит от того что с ним делали до этого.
Например, кто-то вызвал Dispose для него.
То есть для работы с ним нужно соблюдать какие-то условия безопасности.
А публичным свойством может воспользоваться кто угодно и не безопасно.
Лучше всего DbContext инкапсулировать в Репозитори.
Но в простых решениях DbContext часто используется напрямую.
Предпочтительно его инкапсулировать в основной (или единственной) VM или создавать только на один запрос (транзакцию).
1
4 / 4 / 0
Регистрация: 01.11.2013
Сообщений: 216
24.11.2022, 13:13  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Для этого нужен Code First.
У меня база стояла пустая, когда я ConnStr поменял с SQLServer на SQLite, даже файла не было. Я нажал F5, запустился проект, я начал нажимать кнопки, добавлять в контекст объекты, потом контекст при сохранении сам создал таблицы и сложил в них все, что я в него добавил, записал все это в файл. Это же и есть CodeFirst. Code First - это когда мы создаем классы, устанавливаем в них корректно названные свойства (чтобы контекст мог их связать между собой), потом инициализируем контекст, а в нем коллекции DbSet с нашими классами, дальше он сам уже с базой общается. Или нет? В любом случае, файл я выложил.

Добавлено через 2 минуты
Цитата Сообщение от Элд Хасп Посмотреть сообщение
DbContext имеет "историю"
Вот чтобы обезопасить себя от этого я в CompaniesContext сделал Singleton, посмотрите, там статический метод GetInstance()
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16152 / 11273 / 2890
Регистрация: 21.04.2018
Сообщений: 33,147
Записей в блоге: 2
24.11.2022, 13:15
Цитата Сообщение от Vanka03 Посмотреть сообщение
Это же и есть CodeFirst.
Code First - это создание БД со структурой текущего DbContext.
По вашему описанию, вроде, да. Сейчас запущу у себя - проверю.

Добавлено через 2 минуты
Цитата Сообщение от Vanka03 Посмотреть сообщение
Вот чтобы обезопасить себя от этого я в CompaniesContext сделал Singleton
Это ещё хуже.
Как вы обезопасили если кто-то вызовет Dispose для него.
Например, выполнит его в юсинге?
Свойство экземпляра доступно только тем кто имеет ссылку на экземпляр.
А публичный синглтон, вообще, может получить кто угодно.
0
4 / 4 / 0
Регистрация: 01.11.2013
Сообщений: 216
24.11.2022, 13:17  [ТС]
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Vanka03, Microsoft.Data.Sqlite -> картинка
Это я сделал, конечно же. Но я хотел спросить, нет ли какого-то режима, чтобы к бд подключиться и смотреть ее содержимое, как, например в SQLServer Object Explorer:
Миниатюры
Как отправить данные из одного VM в другой?  
0
4 / 4 / 0
Регистрация: 01.11.2013
Сообщений: 216
24.11.2022, 13:19  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Это ещё хуже.
В любом случае, мне это больше не понадобится, коль скоро у меня все окна будут обращаться к одной VM
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16152 / 11273 / 2890
Регистрация: 21.04.2018
Сообщений: 33,147
Записей в блоге: 2
24.11.2022, 13:44
Vanka03, синхронизировал.
Образец БД задан в проекте.
Если после сборки перейти в папку, удалить файл БД и запустить приложение (из проводника), то БД не будет создана.
Значит Code First нет или он неверно работает.

Добавлено через 1 минуту
Если запускать из Студии, то Студия проверяет сборку и если нет файла, закидывает туда его из Проекта.
0
 Аватар для Andrey-MSK
3368 / 2254 / 388
Регистрация: 14.08.2018
Сообщений: 7,631
Записей в блоге: 4
24.11.2022, 13:52
Цитата Сообщение от Vanka03 Посмотреть сообщение
чтобы к бд подключиться и смотреть ее содержимое
SQLiteStudio
2
4 / 4 / 0
Регистрация: 01.11.2013
Сообщений: 216
24.11.2022, 14:05  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Например такой: ToArrayConverter.
Я реализовал конвертер, похожий на Ваш, но столкнулся с проблемой: он вызывается при запуске приложения, а в момент запуска у меня свойство SelectedCompany пустое. Соответственно возвращает коллекцию с пустым объектом всегда =( Видимо, это потому что источник данных запрашивается один раз в самом начале. Что-то можно с этим сделать?

Добавлено через 1 минуту
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Значит Code First нет или он неверно работает.
Да, видимо, что-то не пашет, попробую разобраться.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.11.2022, 14:05
Помогаю со студенческими работами здесь

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

Как отправить файл с одного компьютера на другой
Как отправить файл с одного компьютера на другой?

Как отправить сообщение с одного email-а на другой?
Добрый день Господа . Вопрос следующий как отправить с одной почты на другую сообщение . В каком направлении копать , может исходник есть у...

Как отправить Post запрос с одного сервера на другой
Добрый вечер. Вопрос в теме. Пробовал так: http.request(url, function(req, res) { }); Но таким способом не происходит ни ошибки,...

Как отправить сообщение с одного компьютера на другой компьютер в локальной сети?
Необходимо, зная ip адрес или имя компьютера вывести сообщение с одного компьютера на другой. как это осуществить. заранее спасибо за...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения Продолжаю серию постов о дискретно-событийной модели рабочего. . .
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
Модель здравосохранения 18. Чем здоровее работник, тем быстрее выгорает
anaschu 24.05.2026
Имитационная модель корпоративного здравоохранения: что показывает математика Сегодня в модели рабочего коллектива на AnyLogic появились три новые механики — выгорание через накопленную усталость,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru