Wpf как передать данные из одного окна в другое
Перейти к содержимому

Wpf как передать данные из одного окна в другое

  • автор:

c# WPF Как передать данных из одного окна в другое

Доброго времени суток господа эксперты. Подскажите пожалуйста новичку в WPF. В главном окне есть кнопка открытия диалогового окна формы. Как после заполнения полей вернуть эти данные в главное окно для последующего сохранения в бд и обновления списка? Не смог найти подходящей реализации. Ниже код приложения. Сразу не кидайте палки и камни, код приложения тестовый поэтому здесь сумбур, создал для понимания процесса из него буду собирать нормальное , когда приведу в порядок все операции CRUD.Заранее спасибо за помощь. Главное окно RecordsWindowView

 public partial class RecordsWindowView : Window < public RecordsWindowView() < InitializeComponent(); DataContext = new RecordsViewModel(); >> 

Вьюмоделька:

 public class RecordsViewModel : ViewModelBase 
 private Article _selectedRecord; public Article SelectedRecord < get < return _selectedRecord; >set < _selectedRecord = value; OnPropertyChanged("SelectedRecord"); >> public RecordsViewModel() < LoadData(); >private void LoadData() < using (AppDbContext context = new AppDbContext()) < var listRecords = context.News.ToList(); _records = new ObservableCollection(listRecords); > > private ObservableCollection _records < get; set; >public ObservableCollection Records < get < return _records; >set < _records = value; OnPropertyChanged("CollectionCar"); >> private ICommand _addNewItemCommand; public ICommand AddNewItemCommand => _addNewItemCommand ?? (_addNewItemCommand = new MyCommand(AddFormRecord)); private async void AddFormRecord(object obj) < AddFormView addRecordWindow = new AddFormView(); if (addRecordWindow.ShowDialog() == true) < var newRecord = (AddFormVM)addRecordWindow.DataContext; using (AppDbContext context = new AppDbContext()) < await context.News.AddAsync(newRecord.Record); await context.SaveChangesAsync(); >> > 

> Диалоговое окно формы:

public partial class AddFormView : Window < // public Article Record < get; set; >public AddFormView() < InitializeComponent(); //Record = rec; //DataContext = Record; DataContext = new AddFormVM (); >private void Accept_Click(object sender, RoutedEventArgs e) < this.DialogResult = true; >> 

Вторая вьюмодель:

public class AddFormVM : ViewModelBase < private Article _record; public Article Record < get < return _record; >set < _record = value; OnPropertyChanged("SelectedRecord"); >> > 

Базовая модель:

 public class ViewModelBase : INotifyPropertyChanged < public event PropertyChangedEventHandler PropertyChanged; public void OnPropertyChanged([CallerMemberName] string prop = "") < // PropertyChanged получает свойство из окна xlm какогото поля и обновляет событие PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(prop)); >> 

Главное окно со списком записей:

        " FontFamily="Arial" FontStyle="Italic" /> " FontFamily="Arial" FontStyle="Italic" /> " FontFamily="Arial" FontStyle="Italic" /> " FontFamily="Arial" FontStyle="Italic" /> " FontFamily="Arial" FontStyle="Italic" /> " FontFamily="Arial" FontStyle="Italic" />   >" CommandParameter="" Content="DELETE"/>      

Диалоговое окно формы:

                    " /> " /> " /> " /> " />      

Wpf как передать данные из одного окна в другое

Рассмотрим, как мы можем взаимодействовать с несколькими окнами в WPF. Для этого создадим новый проект. По умолчанию он уже содержит одно главное окно MainWindow. Теперь добавим еще одно окно. Для этого в окне добавления нового элемента нам надо выбрать тип «Window (WPF)»:

Добавление окна в WPF

Назовем его TaskWindow .

Теперь определим на главном окне MainWindow кнопку для открытия нового окна:

Обработчик нажатия кнопки Button_Click будет выглядеть так:

private void Button_Click(object sender, RoutedEventArgs e)

Для открытия нового окна создаем его объект и затем вызываем метод Show() .

Взаимодействие между окнами в WPF

При нажатии на кнопку открывается окно TaskWindow.

Используя ссылку на окно, мы можем взаимодействовать с ним, например, передавать ему данные из главной формы или вызывать его методы. Например, изменим код C# класса TaskWindow:

using System.Windows; namespace WindowApp < public partial class TaskWindow : Window < public string ViewModel < get; set; >public TaskWindow() < InitializeComponent(); >public void ShowViewModel() < MessageBox.Show(ViewModel); >> >

Здесь добавлено свойство ViewModel и метод, который отображает его содержимое. Теперь изменим обработчик Button_Click в главном окне MainWindow:

private void Button_Click(object sender, RoutedEventArgs e)

Здесь у окна TaskWindow устанавливается свойство ViewModel и вызывается его метод.

Важно отметить, что после открытия эти окна существуют независимо друг от друга. Мы можем закрыть главное окно MainWindow, и второе окно TaskWindow все равно продолжит свою работу. Однако мы можем задать и другое поведение.

У всех окон есть свойство Owner , которое указывает на главное окно, владеющее текущим окном. Так, изменим обработчик Button_Click в главном окне:

private void Button_Click(object sender, RoutedEventArgs e) < TaskWindow taskWindow = new TaskWindow(); //Теперь MainWindow главное окно для taskWindow taskWindow.Owner = this; taskWindow.Show(); >

Теперь текущий объект MainWindow является владельцем taskWindow. Если, к примеру, мы закроем MainWindow, то закроется и TaskWindow.

Кроме того, мы можем обращаться из TaskWindow к своему владельцу:

public partial class TaskWindow : Window < public void ChageOwnerBackground() < this.Owner.Background = new SolidColorBrush(Colors.Red); >// остальной код >

С другой стороны все зависимые окна доступны в главном окне-владельце через свойство OwnedWindows :

private void Button_Click(object sender, RoutedEventArgs e) < TaskWindow taskWindow = new TaskWindow(); taskWindow.Owner = this; taskWindow.Show(); foreach(Window window in this.OwnedWindows) < window.Background = new SolidColorBrush(Colors.Red); if (window is TaskWindow) window.Title = "Новый заголовок!"; >>

Класс App и свойство Windows

Еще одним способ для взаимодействия с окнами предоставляет класс App — главный класс приложения. Он содержит свойство Windows , которое хранит информацию обо всех открытых окнах приложения. И в любом месте программы мы можем получить эту информацию:

foreach(Window window in App.Current.Windows) < window.Background = new SolidColorBrush(Colors.Red); // если окно - объект TaskWindow if (window is TaskWindow) window.Title = "Новый заголовок!"; >

Как передать два значения из одного окна в другое?

Подсмотрел на данном форуме конструкцию для переноса переменных из одного окна в другое.
Она простая и её удобно использовать, но я не смог с помощью неё перенести ДВЕ переменные.
Подскажите пожалуйста, как с помощью этой конструкции передать две переменные, или она не подходит и нужен другой способ?

P.S. пытался с помощью массива, но когда на выходе проверял переменные, почему то они всегда были равны нулю.
Окно с которого переношу Window1

shina =1 MainWindow mainWindow = new MainWindow(shina); //получается только с одной переменной

Окно на которое переношу MainWindow

1 2 3 4
public MainWindow(double shina) : this() { nrandom = shina; }

94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Как передать текст с одного диалогового окна в другое
Создал 2 диалога с помощью CreateDialog. Разместил в них органы для текста.(IDC_TEXT,IDC_TEXT2). Не.

Передать сообщение из одного окна в другое
У кого есть мысли по этому поводу?

Передать переменную из одного окна в другое
Здравствуйте! В первом окне, есть метка, для неё я задал переменную i = 999; А во втором окне, есть.

Передать данные из одного окна в другое
Добрый Вечер Не получается передать данные из окна Form2 в окно Form1 в Form2 я получаю id и.

Эксперт .NET

15225 / 10343 / 2721
Регистрация: 21.04.2018
Сообщений: 30,655
Записей в блоге: 2

ЦитатаСообщение от woodmac Посмотреть сообщение

Окно на которое переношу MainWindow

1 2 3 4 5
public MainWindow(double shinaб string title) : this() { nrandom = shina; Title = title; }

ЦитатаСообщение от woodmac Посмотреть сообщение

Окно с которого переношу Window1

MainWindow mainWindow = new MainWindow(1, "первый");

Регистрация: 08.10.2021
Сообщений: 22

Извините, но можете показать что я не так делаю.

1 2 3 4 5
public MainWindow(double shina double xmark1) : this() { // ^ здесь пишет ошибка синтаксиса }
1 2 3
double random; double xmark1; MainWindow mainWindow = new MainWindow(random , xmark1);

Эксперт .NET

15225 / 10343 / 2721
Регистрация: 21.04.2018
Сообщений: 30,655
Записей в блоге: 2

ЦитатаСообщение от woodmac Посмотреть сообщение

здесь пишет ошибка синтаксиса

Вы совсем Шарп не знаете?
Я писал здесь, в редакторе сообщений, и случайно пропустил запятую между параметрами конструктора.

Добавлено через 2 минуты
Вернее не пропустил, а не в в той раскладке клавишу нажал.
Посмотрите — после первого параметра русская «б» — это запятая в английской раскладке.

Регистрация: 08.10.2021
Сообщений: 22
Да, я только начал изучать, спасибо за помощь

Эксперт .NET

15225 / 10343 / 2721
Регистрация: 21.04.2018
Сообщений: 30,655
Записей в блоге: 2

ЦитатаСообщение от woodmac Посмотреть сообщение

Да, я только начал изучать, спасибо за помощь

Ой и трудно вам будет.
У WPF довольно высокий порог вхождения.
Осваивать одновременно ООП, Шарп и WPF — будет крайне трудно.
А у вас похоже ещё и преподавательский состав не шибко.
В Решении с правильной архитектурой задачи «передать из View в другой View» даже возникать не должно.
Вас вместо того, что учить какая должна быть правильная архитектура, и как её правильно реализовывать учат искать кривые костыли для груды других кривых костылей.

87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

Передать нажатие клавиши из одного окна в другое
Приветствую. Пишу здесь, так как отчаялся и на решение данного вопроса самостоятельно ушло 4 часа.

передать значение из одного поля диалогового окна в другое поле
Извините, поиском не могу найти ответ на простейший вопрос. Как считать или вывести данные.

Передать значения из одного события в другое
Здравствуйте. Есть два события БаттонКлик 1 и БаттонКлик 2. В первом вычисляем формулу (для.

Передача значения из одного окна в другое
Здравтсвуйте! В окне браузера открыта страница. При клике на ссылку вызвали новое окно.

Передача значения с одного окна в другое
Доброго времени суток. Делаю игру по типу монополии, и возник вопрос над которым уже сижу пару.

Передача значения из одного окна в другое для дальнейшего использования
Ребята, всем привет! Работаю сейчас над проектом, который требует регистрации по ключу (до ввода.

Как передать массив из одного в другое
Есть два массива e1 и e2. Соответственно значение и время. Они вычисляются после нажатия кнопки1.

WPF. Передача данных между формами.

Windows Presentation Foundation — один из компонентов ядра .NET Framework, который позволяет разработчикам создавать богатые, различные Windows приложения.

Как осуществить передачу данных между окнами и страницами?

Чтобы передать данные между формами приложении WPF, нужно иметь сами формы.

Предположим, что у нас есть форма в которой мы вводим свои данные (Рисунок 1) и форма в которой эти данные отображаются (Рисунок 2).

WPF. Главная форма

WPF. Вторичная форма

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

public Infos()

На следующий код:

public Infos(string name) // добавляем переменную < InitializeComponent(); lable_Name.Content += name; // добавляем значение переменной к тексту >

А в том месте где вызывается данное окно, в моём случае в функции которая происходит на клик кнопки, прописываем код:

string name = textBox_name.Text; // получаем имя из текстового поля new Infos(name).ShowDialog(); // вызываем окно, передавая данные

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

WPF. Результат передачи данных

Таким способом можно передавать совершенно разные данные, будь то, числа, текста или объекты.

Автор статьи: Александр Каримов.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *