Как обновить окно вместо создания нового в wpf
У меня есть программа с моим MainWindow и моим Window1. У меня есть несколько кнопок и несколько меток в MainWindow, когда я нажимаю одну, он открывает Window1 (все эти кнопки открывают одно и то же Window1, но с другим содержимым в зависимости от кнопки, которую я нажимаю). Затем в Window1 у меня есть текстовое поле и кнопка, когда я нажимаю кнопку, она должна заполнять одну из меток в MainWindow, и это происходит, проблема в том, что при попытке заполнить другую метку он удаляет предыдущие метки, которые я заполнил .
Мой полный проект немного отличается, но больше. Извините, если вы меня не поняли, я не говорю по-английски.
2 ответа
Как было сказано ранее, вы создаете новое окно MainWindow, которое отменяет все ваши предыдущие изменения. Попробуйте назначить MainWindow владельцем Window1, чтобы вы могли ссылаться на исходное окно Window.
Примерно так:
MainWindow:
Поскольку вы воссоздаете MainWindow. Каждый раз, когда вы открываете новое окно, вы создаете новый экземпляр MainWindow в этом классе, поэтому старое текстовое поле очищается.
Окно обновления C# WPF при нажатии кнопки
Я возился с C# в Visual Studio (довольно новичок в нем) и пытался создать приложение с использованием WPF, и я не могу понять, как в моей среде обновлять представление WPF при нажатии кнопки. Я попытался сократить свой код до соответствующей информации
В моем CS-файле есть следующий сценарий
Мой файл MainWindow.xaml имеет класс, определенный как .MainWindow, а файл MainWindow.xaml.cs выглядит следующим образом
Что в этом контексте означает «Обновить мое представление WPF»?
Может, это неправильно сформулировано. Возможно, добавьте новые элементы xaml в существующее окно или закройте существующее окно и снова вызовите window.ShowDialog (). Просто нужно обновить окно просмотра новыми элементами.
Как вы «добавляете кучу предметов»? Вы добавляете в свой «MainWindow», который на самом деле является UserControl?



Ответы 1
Если вы хотите, чтобы ваш слой View обновлялся при нажатии кнопки, вы можете переназначить DataContext . Например:
Но если вы следуете шаблону MVVM, ваш DataContext должен наследовать от интерфейса INotifyPropertyChanged , и вы также можете просто вызвать событие PropertyChangedEventHandler , чтобы обновить определенные привязки на уровне View . Например:
Я не мог заставить это работать, но, вероятно, это мои технические возможности. Я управляю решением, объявляя window и mainwindow глобальными элементами, а затем могу получить доступ к их контексту с помощью функции eval click. Вероятно, не лучшее решение, но оно заработало.
Как обновить окно в WPF?
У меня есть Request.xaml файл где есть мно-во и TextBox-ы Combox-ов и кнопка, так вот мне нужно при нажатии ее чтобы текст в TextBox-ах вернулся в дэфолтное состояние. Мне нужно это реализовать, чтобы пользователь мог опять ввести данные туда, а я при этом при нажатии кнопки еще и сохранил эти данные.
Еще повторю вопрос как или обновить окно, или во все Combox-ах вернуть дефолтное значения.
Тут мне предлогали
/** * GeSHi (C) 2004 — 2007 Nigel McNie, 2007 — 2008 Benny Baumann * (http://qbnz.com/highlighter/ and http://geshi.org/) */ .csharp.geshi_code
1 ответов
Начнем с того какой подход используется при разработке WPF-приложения. Есть два подхода: без использования MVVM и с использованием MVVM. Для понимания разницы очень рекомендую прочитать следующую статью — http://msdn.microsoft.com/ru-ru/magazine/dd419663.aspx.
В предложенном варианте на SO подразумевается такая концепция WPF как привязка данных. Читаем здесь про привязку данных и что такое DataContext.
Теперь собственно к вопросу. Есть два варианта. В первом варианте можно сделать следующим образом: в code-behind файле окна добавить процедуру, которая будет устанавливать значения по умолчанию у элементов управления при вызове окна или по нажатию на кнопку.
//например
private void InitDefault ( )
<
TextBox1. Text = «Значение по умолчанию1» ;
TextBox2. Text = «Значение по умолчанию2» ;
//.
ComboBox1. SelectedIndex = 0 ;
ComboBox2. SelectedIndex = 0 ;
//итд
>
Собственно все также, как и в WinForms без MVP. Вариант легкий, но чреват проблемами сопровождения в дальнейшем.
Вариант второй — привязка данных/MVVM.
//XAML
< Window x : Class = «WpfApplication1.MainWindow»
xmlns = «http://schemas.microsoft.com/winfx/2006/xaml/presentation»
xmlns : x = «http://schemas.microsoft.com/winfx/2006/xaml»
Title = «MainWindow» Height = «350» Width = «525» >
< StackPanel >
< TextBox x : Name = «TextBox1» Width = «200» HorizontalAlignment = «Left» Text = «
< ComboBox x : Name = «ComboBox1» HorizontalAlignment = «Left» ItemsSource = «
< Button x : Name = «Button1» HorizontalAlignment = «Left» Content = «Save» Command = «
</ StackPanel >
</ Window >
//
//
//ViewModel
public class MainViewModel : INotifyPropertyChanged
<
private IList < string > _items ;
private bool _canExecute ;
private ICommand _clickCommand ;
private string _textValue ;
private string _selectedValue ;
public string SelectedValue
<
get < return _selectedValue ; >
set
<
_selectedValue = value ;
OnPropertyChanged ( «SelectedValue» ) ;
>
>
public string TextValue
<
get < return _textValue ; >
set <
_textValue = value ;
OnPropertyChanged ( «TextValue» ) ; >
>
public void Save ( )
<
SelectedValue = _items. FirstOrDefault ( ) ;
TextValue = «Значение по умолчанию» ;
>
public MainViewModel ( )
<
_items = new List < string > < "Test1" , "Test2" , "Test3" >;
_selectedValue = _items. First ( ) ;
_textValue = «Значение по умолчанию» ;
_canExecute = true ;
>
public event PropertyChangedEventHandler PropertyChanged ;
public void OnPropertyChanged ( string propertyName )
<
if ( PropertyChanged != null )
<
PropertyChanged ( this , new PropertyChangedEventArgs ( propertyName ) ) ;
>
>
>
public class RelayCommand : ICommand
<
private Action _action ;
private bool _canExecute ;
public RelayCommand ( Action action, bool canExecute )
<
_action = action ;
_canExecute = canExecute ;
>
public bool CanExecute ( object parameter )
<
return _canExecute ;
>
public event EventHandler CanExecuteChanged ;
public void Execute ( object parameter )
<
_action ( ) ;
>
>