如何在WPF中重新加载(重置)整个页面?

时间:2013-11-19 10:17:42

标签: c# wpf xaml

我有Request.xaml按钮和许多combox,所以我想重新加载它并将combox值设置为在按钮点击后将其设置为默认值。我当然会做更多的工作人员。

我的Request.xaml代码包含代码的这些部分:

<TextBox x:Name="TxtBlock_numRequest" TextWrapping="Wrap" Height="23"/>

                <ComboBox  x:Name="CmbBox_lvlPriority" Width="160"> 
                   <ComboBoxItem Content="1" Name="High" />
                   <ComboBoxItem Content="2" Name="Medium" />
                   <ComboBoxItem Content="3"  Name="Low" />
                   </ComboBox>    

此外,xaml代码如 event <Button Content="Next request" Width="160" VerticalAlignment="Bottom" Background="#FF339933" Click="Button_Click" />

Request.xaml.cs文件只有private void Button_Click(object sender, RoutedEventArgs e)个功能。

我以这种方式显示Request.xaml:首先,MainWindow.xaml显示MainPage.xaml,  <mui:Link DisplayName="Generation" Source="/Pages/MainPage.xaml" />,  最后MainPage.xaml发送Request.xaml`

是否可以重置整个页面,因为我需要让用户有机会将新请求的参数添加到现有参数中,这些参数最终将位于.xml文件中?

可以通过 OnNavigatedTo方法 UIElement.InvalidateVisual方法http://msdn.microsoft.com/en-us/library/system.windows.uielement.invalidatevisual.aspx

来实现

3 个答案:

答案 0 :(得分:2)

当然可以!但是......你是否将组合框数据化为一些底层对象实例?

然后你可以很容易地做到这一点&#34; hard&#34;方式和设置

page.DataContext = null;
page.DataContext = new Foo();

然后将使用&#34;默认&#34;重新初始化所有数据绑定。值。

答案 1 :(得分:1)

到目前为止,我没有使用MVVM / DataContext,因此在特定情况下,只有一种方法可以将值设置为默认值,而是手动执行。

TxtBlock_numRequest.Text = "Default";

但是这个解决方案看起来很糟糕,但至少它可行。

解决此问题的另一种方法是使用MVVM和DataBinding。该解决方案由@ZeroART提供:

//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;
        }

答案 2 :(得分:1)

如果要保留在同一页面上但清除所有字段(例如,如果该页面的DataContext需要使用参数来创建),则只需将类似方法添加到页面或用户控件的... xaml中。 CS文件:

    private void Clear(object sender, RoutedEventArgs e)
    {
        this.DataContext = null;
    }