Как обновить окно в 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 {font-family:monospace;} .csharp.geshi_code .imp {font-weight: bold; color: red;} .csharp.geshi_code .kw1 {color: #0600FF;} .csharp.geshi_code .kw2 {color: #FF8000; font-weight: bold;} .csharp.geshi_code .kw3 {color: #008000;} .csharp.geshi_code .kw4 {color: #FF0000;} .csharp.geshi_code .kw5 {color: #000000;} .csharp.geshi_code .co1 {color: #008080; font-style: italic;} .csharp.geshi_code .co2 {color: #008080;} .csharp.geshi_code .co3 {color: #008080;} .csharp.geshi_code .coMULTI {color: #008080; font-style: italic;} .csharp.geshi_code .es0 {color: #008080; font-weight: bold;} .csharp.geshi_code .es_h {color: #008080; font-weight: bold;} .csharp.geshi_code .br0 {color: #000000;} .csharp.geshi_code .sy0 {color: #008000;} .csharp.geshi_code .st0 {color: #666666;} .csharp.geshi_code .st_h {color: #666666;} .csharp.geshi_code .nu0 {color: #FF0000;} .csharp.geshi_code .me1 {color: #0000FF;} .csharp.geshi_code .me2 {color: #0000FF;} .csharp.geshi_code span.xtra { display:block; }
page.DataContext = null;
page.DataContext = new Foo();

Но я не понял, что это. Несколько подробнее вопрос описан тут http://stackoverflow.com/questions/20068788/how-to-reload-reset-the-whole-page-in-wpf

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="{Binding TextValue, UpdateSourceTrigger=PropertyChanged}"></TextBox>
        <ComboBox x:Name="ComboBox1" HorizontalAlignment="Left" ItemsSource="{Binding Items}" SelectedValue="{Binding SelectedValue, UpdateSourceTrigger=PropertyChanged}" Width="200"/>
        <Button x:Name="Button1" HorizontalAlignment="Left" Content="Save" Command="{Binding ClickCommand}" Width="116"/>
    </StackPanel>
</Window>
//
//
//ViewModel
public class MainViewModel : INotifyPropertyChanged
    {
        private IList<string> _items;
        private bool _canExecute;
        private ICommand _clickCommand;
        private string _textValue;
        private string _selectedValue;

        public IList<string> Items
        {
            get { return _items; }
        }

        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 ICommand ClickCommand
        {
            get { return _clickCommand ?? (new RelayCommand(() => Save(), _canExecute)); }
        }

        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();
        }
    }

Плюс в коде формы(или можно задать в разметке):

private readonly MainViewModel _viewModel;
public MainWindow()
        {
            InitializeComponent();
            _viewModel = new MainViewModel();
            this.DataContext = _viewModel;
        }