如何在运行时更改WPF窗口内容

时间:2012-01-21 11:49:40

标签: wpf model-view-controller mvvm controls

我有一个带有四个按钮的窗口,用于添加,搜索,删除和更新数据库查询。

单击其中一个按钮后,我打开一个新窗口,其中包含针对这些功能的特定WPF控件。

如何在不打开新窗口的情况下执行此操作?一切都应该在一个窗口中发生,只有WPF控件应该更改,并且代码背后。单击“返回”或“执行”后,我想返回主窗口。

3 个答案:

答案 0 :(得分:6)

关键是ContentControl - 您将更改其内容:

<ContentControl Content="{Binding WhatToShow}"/>

在您的视图模型中,您将拥有属性object WhatToShow

if(some_condition) 
  WhatToShow = new SomeView(someViewModel);
else
  WhatToShow = new AnotherView(anotherViewModel);

或者您可以查看Caliburn.Micro,这是一个使屏幕导航更容易的MVVM框架。

答案 1 :(得分:1)

我会重新考虑下一个方法:

  1. 将TabControl放到您的视图中 - 将使用TabControl 在不同观点之间切换
  2. 为隐藏标签页眉(how to hide tab control headers?
  3. 的TabControl应用样式
  4. 为将要切换的每个视图准备视图模型,例如, ViewModel1,ViewModel2。
  5. 准备聚合所有切换视图模型的主视图模型,例如

     public class MainViewModel : INotifyPropertyChanged
    
        {
    
             private ViewModel1 _viewModel1 = new ViewModel1();
    
             private ViewModel2 _viewModel2 = new ViewModel2();
    
             private INotifyPropertyChanged _currentViewModel;
             public INotifyPropertyChanged CurrentViewModel
             {
                 get { return _currentViewModel; }
                 set
                 {
                     _currentViewModel = value;
                     RaisePropertyChanged(() => CurrentViewModel);
                 }
              }
    
                public IEnumerable<INotifyPropertyChanged> ViewModelsToSwitch
                {
                    get
                    {
                        return new INotifyPropertyChanged[]
                                   {
                                       _viewModel1,
                                       _viewModel2
                                   };
                    }
                }
    
            // INotifyPropertyChanged implementation
    

    }

  6. 将MainViewModel绑定到TabControl:

  7.  <Window x:Class="SwitchViewDemo.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">
            <Grid>
                <TabControl ItemsSource="{Binding ViewModelsToSwitch}"
                            SelectedItem="{Binding CurrentViewModel}"/>
            </Grid>
        </Window>
    

    6。声明每个视图模型的视图:

    <Window x:Class="WpfApplication4.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">
        <Window.Resources>
            <DataTemplate DataType="{x:Type ViewModel1}">
                <TextBlock Text="View 1"/>
            </DataTemplate>
            <DataTemplate DataType="{x:Type ViewModel2}">
                <TextBlock Text="View 2"/>
            </DataTemplate>
        </Window.Resources>
        <Grid>
            <TabControl ItemsSource="{Binding ViewModelsToSwitch}"
                        SelectedItem="{Binding CurrentViewModel}"/>
        </Grid>
    </Window>
    

    7。在MainViewModel中设置CurrentViewModel到ViewModel1或ViewModel2并将显示与此视图模型视图关联。

    <强>优点:

    • 对应于MVVM模式 - 因此您获得所有MVVM benefits
    • 良好的缩放。如果要添加新的ViewModel3,只需将此视图模型添加到主视图模型,并创建附加的DataTemplate,以声明视图模型在指定视图上的映射。

答案 2 :(得分:0)

而不是Window,为每个操作创建一个网格。并在该网格内放置其特定控件。将所有网格的可见性设置为Visibility.Collapsed。当有人按下其中一个按钮时,将相关网格的Visibility设置为Visibility.Visible,将另一个设置为折叠。 话虽如此,使用UserControls更加有条理,UserControls非常易于使用。只需在那里添加您的XAML并将其包含在主窗口中。然后像我之前所说的那样隐藏和展示。