如何在MainWindow

时间:2015-04-30 19:32:51

标签: wpf mvvm

所以我在网上看了一个视频,向我展示了如何在WPF应用程序中实现MVVM。请注意,就两者而言,我都是新手。

我有以下类,它们构成了我的WPF应用程序的Model,View和ViewModel层:

  • App类(.xaml和.xaml.cs)
  • MainWindow类(.xaml和.xaml.cs)
  • MainWindowViewModel.cs
  • MalfunctionsView(.xaml和.cs)
  • MalfunctionsViewModel.cs
  • PartsView(.xaml和.cs)
  • PartsViewModel.cs

基本上我只有两个视图(故障和部件)被加载到MainWindow视图中。

我现在已经进行了设置,因此我可以在内部和外部注释代码以显示MainWindow中的MalfunctionView或PartsView。例如,如果我想看到MalfunctionView,那么我会注释掉所有的PartsView代码,然后在VS中重新运行它。是的,我知道......这是悲伤和可怜的,但我还没有学会如何卸载一个视图并在飞行中加载另一个视图。这让我想到了一个问题:如何从MainWindow卸载一个视图,然后将另一个视图加载到MainWindow中?例如,我在PartsView上有一个名为Select的按钮,点击它时然后需要从MainWindow卸载PartsView并在其中加载MalfunctionsView。

我包含了我为App类和MainWindow View和MainWindow ViewModel编写的代码,以便可以看到我当前如何将ViewModel(用户控件)加载到MainWindow中。

App.xaml.cs

public partial class App : Application {
        protected override void OnStartup(StartupEventArgs e) {
            base.OnStartup(e);

            // Create MainWindow ViewModel
            var mainWindowVM = new MainWindowVM();

            // Create MainWindow View
            MainWindow mainWindowVw = new MainWindow();

            // Set MainWindow View datacontext to MainWindow ViewModel and then show the window
            mainWindowVw.DataContext = mainWindowVM;
            mainWindowVw.Show();   
        }
    }

MainWindow.xaml

<Window x:Class="PAM.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:vm="clr-namespace:PAM.ViewModel"
        xmlns:vw="clr-namespace:PAM.View"
        Title="Parts and Malfunctions" Height="800" Width="550">

    <Window.Resources>
        <DataTemplate DataType="{x:Type vm:MalfunctionsViewModel}">
            <vw:MalfunctionsView />
        </DataTemplate>
        <DataTemplate DataType="{x:Type vm:PartsViewModel}">
            <vw:PartsView />
        </DataTemplate>
    </Window.Resources>

    <Grid Width="Auto" Height="Auto">
        <ScrollViewer>
            <ItemsControl Width="Auto" Height="Auto" ItemsSource="{Binding ViewModels}"></ItemsControl>
        </ScrollViewer>
    </Grid>
</Window>

MainWindowViewModel.cs

public class MainWindowViewModel : ViewModelBase {

        readonly MalfunctionRepository _mfRepo;
        //readonly PartsRepository _pRepo;

        ObservableCollection<ViewModelBase> _viewModels;

        public ObservableCollection<ViewModelBase> ViewModels {
            get {
                if (_viewModels == null)
                    _viewModels = new ObservableCollection<ViewModelBase>();

                return _viewModels;
            }
        }

        public MainWindowViewModel() {

            // ================================
            // Malfunctions ViewModel
            _mfRepo = new MalfunctionRepository();

            MalfunctionsViewModel viewModel = new MalfunctionsViewModel(_mfRepo);

            // ================================
            // Parts ViewModel
            //_pRepo = new PartsRepository();

            //PartsViewModel viewModel = new PartsViewModel(_pRepo);

            this.ViewModels.Add(viewModel);
        }
    }

1 个答案:

答案 0 :(得分:7)

在您的MainWindow.xaml中:

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

在ViewModel中:

private object content;
public object Content
{
    get { return content; }
    set
{
    content = value; 
    NotifyPropertyChanged(p => p.Content);
}       

...

MalfunctionsViewModel mvm = new MalfunctionsViewModel(_mfRepo);
Content = mvm;

...

PartsViewModel pvm = new PartsViewModel(_pRepo);
Content = pvm;

查看我几年前提出的非常相似的问题:WPF MVVM: How to load views "on demand" without using plug-in architecture?

相关问题