Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.52/25: Рейтинг темы: голосов - 25, средняя оценка - 4.52
32 / 4 / 0
Регистрация: 23.11.2016
Сообщений: 39
.NET 5

Передача данных из одной ViewModel в другую

04.10.2021, 11:27. Показов 5503. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!
Только начинаю постигать C# и патрн MVVM.
Помогите разобраться.
Есть две View-ки (TestView и TestSpravochikCounter) у каждой своя ViewModel (TestViewModel и TestSpravochikCounterViewModel) соответственно
DataContext устанавливаю через XAML
C#
1
 DataContext="{Binding TestSpravochikCounterViewModel, Source={StaticResource Locator}}"
Из TestViewModel по команде на кнопке вызываю TestSpravochikCounter
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
private TestSpravochikCounter spravochikCounter;
        private ICommand openSpr;        
 
        public ICommand OpenSpr => openSpr
       ??= new DelegateCommand(OnOpenSpr);
 
        private void OnOpenSpr(object p)
        {
            TestInvose testInvose = new();
 
            spravochikCounter = new();            
            spravochikCounter.ShowDialog();
        }
В TestSpravochikCounter есть DataGrid
C#
1
2
3
<DataGrid  
                  ItemsSource="{Binding Counterpartys}" 
                      SelectedItem="{Binding SelectedCounterparty}">
в его TestSpravochikCounterViewModel есть свойство-зависимости
C#
1
2
3
4
5
6
7
8
9
 private Counterparty selectedCounterparty;
 
        /// <summary>Выбранный элемент</summary>
        public Counterparty SelectedCounterparty {
            get => selectedCounterparty;
            set {
                Set(ref selectedCounterparty, value);
            }
        }
В TestViewModel так же есть публичное свойство
C#
1
public Counterparty Counterparty {get; set;}

Как из TestSpravochikCounterViewModel передать свойство SelectedCounterparty в свойство Counterparty TestViewModel ?

Если можно конкретным примером, спасибо за понимание!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.10.2021, 11:27
Ответы с готовыми решениями:

Передача данных из одной формы в другую
Имеется 2 формы Form4 и Form5 Form5 вызывается из Form4 при нажатии кнопки В Form5 есть numericUpDown необходимо при...

Передача данных из одной программы в другую
Как извлечь и передать данные (в конкретном случае, целое число) из одной запущенной и работающей программы в другую/другие? Первая...

Передача данных с одной формы на другую
Всем здрасти, подскажите, как передать значение с одной формы на странице page1.php в форму на странице page2.php? Форма 1 на странице...

23
32 / 4 / 0
Регистрация: 23.11.2016
Сообщений: 39
15.10.2021, 13:48  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Попробуйте ещё такой вариант:
Да, так тоже все работает, спасибо!

А как передернуть View, чтобы отобразились изменения
C#
1
ViewModelLocator.Instance.TestViewModel.Invoce.Counterparty = SelectedCounterparty;
В Invoce моей TestViewModel попадает нужный мне контрагент (вижу по точкам останова), но в связанных полях данные не отображаются
XML
1
2
3
4
5
 <TextBox Grid.Row="1" Grid.Column="1" VerticalAlignment="Center" Height="18" Text="{Binding Invoce.Counterparty.Name, UpdateSourceTrigger=PropertyChanged}" Grid.ColumnSpan="3"/>
<TextBlock Text="ИНН" Grid.Row="2" VerticalAlignment="Center" Height="16" HorizontalAlignment="Right" Margin="10,0"/>
<TextBox Grid.Row="2" Grid.Column="1" VerticalAlignment="Center" Height="18" Text="{Binding Invoce.Counterparty.INN, UpdateSourceTrigger=PropertyChanged}"/>
<TextBlock Text="КПП" Grid.Row="2" Grid.Column="2" VerticalAlignment="Center" Height="16" HorizontalAlignment="Right" Margin="10,0"/>
<TextBox Grid.Row="2" Grid.Column="3" VerticalAlignment="Center" Height="18" Text="{Binding Invoce.Counterparty.KPP, UpdateSourceTrigger=PropertyChanged}"/>
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
15.10.2021, 14:20
Цитата Сообщение от Georgy0016 Посмотреть сообщение
В Invoce моей TestViewModel попадает нужный мне контрагент (вижу по точкам останова), но в связанных полях данные не отображаются
Для этого тип Invoce должен реализовывать INPC и уведомлять через него об изменении своих свойств.
Но это будет очередной костыль.

У вас нарушения в архитектуре приложения, поэтому на каждом шаге требуется костыль.
Добавлять интерфейс в Invoce - это уже вообще из ряда вон.
В данном случае, лучше сделать в TestViewModel прокси свойства и привязываться к ним.

Пример для пары свойств:
C#
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
    public class TestViewModel : BaseViewModel
    {
 
        private readonly IRepository<Invoce> invoceRepo;
 
        // Это приватный член и изменять его можно только методом
        private Invoce invoce = new Invoce();
 
        // Это метод метод изменения приватного invoce
        // после изменения уведомляет о необходимости
        // обновить все свойства.
        public bool SetInvoce(Invoce invoce)
            => SetProperty(ref this.invoce, invoce, string.Empty);
 
        // Ниже пара прокси свойств
        private Counterparty _counterparty;
        public Counterparty Counterparty {
            get => _counterparty = invoce.Counterparty;
            set {
                if (SetProperty(ref _counterparty, value))
                    invoce.Counterparty = value;
            }
        }
 
        private string _numberInvoce;
        public string NumberInvoce {
            get => _numberInvoce = invoce.NumberInvoce;
            set {
                if (SetProperty(ref _numberInvoce, value)) {
                    invoce.NumberInvoce = value;
                }
            }
        }
Добавлено через 7 минут
Лучше так:
C#
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
        // Ниже пара прокси свойств
        public Counterparty Counterparty {
            get => invoce?.Counterparty;
            set {
                if (!Equals(invoce?.Counterparty, value)) {
                    if (invoce != null) {
                        invoce.Counterparty = value;
                    }
 
                    OnPropertyChanged();
                }
            }
        }
 
        public string NumberInvoce {
            get => invoce?.NumberInvoce;
            set {
                if (!Equals(invoce?.NumberInvoce, value)) {
                    if (invoce != null) {
                        invoce.NumberInvoce = value;
                    }
 
                    OnPropertyChanged();
                }
            }
        }
Добавлено через 5 минут
Цитата Сообщение от Georgy0016 Посмотреть сообщение
А как передернуть View, чтобы отобразились изменения
С прокси свойствами изменять надо будет так:
C#
1
2
3
4
5
// для удобства (так как часто придётся обращаться) задайте поле
private static readonly TestViewModel testVm = ViewModelLocator.Instance.TestViewModel;
 
    // И где нужно в методе
    testVM.Counterparty = SelectedCounterparty;
0
32 / 4 / 0
Регистрация: 23.11.2016
Сообщений: 39
15.10.2021, 15:48  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Пример для пары свойств:
Не пойму где использовать SetInvoce(Invoce invoce)?

я сделал так:
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
    public class TestViewModel : BaseViewModel
    {
        public TestViewModel(IRepository<Invoce> invoces) {
            invoceRepo = invoces;
        }
 
        private readonly IRepository<Invoce> invoceRepo;
 
        // Это приватный член и изменять его можно только методом
        private Invoce invoce = new() { DateInvoce = DateTime.Now, Guid = Guid.NewGuid(), Status = new() { Id = 1, Name = "Черновик" } };
 
        public Invoce Invoce {
            get => invoce;
            set => SetInvoce(invoce);
        }
        // Это метод метод изменения приватного invoce
        // после изменения уведомляет о необходимости
        // обновить все свойства.
        public bool SetInvoce(Invoce invoce)
            => SetProperty(ref this.invoce, invoce, string.Empty);
 
      
        public Counterparty Counterparty {
            get => invoce?.Counterparty;
            set {
                if (!Equals(invoce?.Counterparty, value)) {
                    if (invoce != null) {
                        invoce.Counterparty = value;
                    OnPropertyChanged();
                    testSpr.Close();
                    }
                    
                }
            }
        }
               
        #region Команды
 
        private TestSpravochikCounter testSpr;
        private ICommand openSpr;
        public ICommand OpenSpr => openSpr
           ??= new DelegateCommand(OnOpenAccountView);
 
        private void OnOpenAccountView(object p)
        {
            testSpr = new();
            testSpr.ShowDialog();
            
 
 
        }
        #endregion
 
    }
и всё равно представление не обновляется (данные о контрагенте не появляются)
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
15.10.2021, 19:17
Цитата Сообщение от Georgy0016 Посмотреть сообщение
Не пойму где использовать SetInvoce(Invoce invoce)?
Там где вы раньше присваивали значение свойству TestViewModel.Invoce.

Делать Invoce публичным не надо.
В нём не реализован INPC и его публичность только создаёт проблемы.

Добавлено через 2 минуты
Если вы нигде его не меняет, и только один раз при инициализации TestViewModel задаёте, то он вообще не нужен.
Сделайте нормальный свойства в TestViewModel, а по команде создавайте экземпляр Invoce по данным из этих свойств и передавайте его куда надо.
при следующем вызове команды будет создан другой экземпляр.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.10.2021, 19:17

Передача данных из одной формы в другую
Добрый день! Подскажите реально ли реализовать следующую задачу? У меня на сайте &quot;А&quot; есть страница с простенькой формой: 2 поля...

Передача данных из одной формы в другую
Мне нужно передать данные из одной формы в другую. С формы Form2 вводятся данные из текстбокса и они должны отобразится в Form3 в listView....

Передача данных из одной формы в другую
Господа, в проекте две формы, в одной есть лэйбл, в другой TrackBar, двигаю бегунок, в обработчике Scroll описываю действия, как мне Value...

Передача данных из одной формы в другую
Нужно передать данные их формы 1 в форму 3. Нужно сделать так чтоб при нажатии на кнопу добавить в форме 1 Студенты все заполненные данные...

Передача данных из одной формы в другую
Здравствуйте! Проблема следующая: Нужно передать даннные изодной формы в другую например, как раньше когда был на CyberForum'е BB-код...


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

Или воспользуйтесь поиском по форуму:
24
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru