具有多个子视图的WPF应用程序 - MVVM

时间:2015-07-18 10:36:52

标签: c# wpf mvvm

我的问题很简单,我希望有一个MainView,它反过来会有多个动态和难以处理的视图,如下图所示:

enter image description here

但要做到这一点,你需要多个ViewModel,我不知道如何组织它们。

我最初的想法是拥有MainViewModel,我将在其中创建将返回所有ChildViewModels的属性,如下所示,但这对我来说似乎不专业并且是一种不好的做法。

public class MainViewModel : BaseViewModel
{
    private EditPropertiesViewModel _editPropertiesViewModel;
    public EditPropertiesViewModel EditPropertiesViewModel
    {
        get { return _editPropertiesViewModel; }
        set
        {
            _editPropertiesViewModel = value;
            base.OnPropertyChanged();
        }

    }


    private UsersDetailsViewModel _usersDetailsViewModel;
    public UsersDetailsViewModel UsersDetailViewModel
    {
        get { return _usersDetailsViewModel; }
        set
        {
            _usersDetailsViewModel = value;
            base.OnPropertyChanged();
        }
    }
    //etc. etc..
}

然后从我的MainView,我将Datacontext设置为MainViewModel 请帮帮我,我不知道该怎么办,我现在完全停顿了。

2 个答案:

答案 0 :(得分:2)

如果您希望在没有PRISM的情况下实现此目的,您可以使用 ContentControl 。对于您创建ContentControl的每个区域,并为每个ContentControl创建其ViewModel属性。然后,您操作与ContentControl关联的选定ViewModel,ContentControl根据分配的ViewModel类型调整视图。澄清一下,看看

XAML:

<Window.DataContext>
    <local:MainViewModel/>
</Window.DataContext>

<Window.Resources>
    <DataTemplate DataType="{x:Type viewModel:SubArticleViewModel}">
        <view:SubArticleView/>
    </DataTemplate>
</Window.Resources>
<ContentControl Content="{Binding ArticleViewModel}"/>

<强> C#

class BaseViewModel : INotifyPropertyChanged
{
       public void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

class MainViewModel 
{
    public BaseViewModel ArticleViewModel { get; set; }
}

class SubArticleViewModel : BaseViewModel
{

}

每当你指定

ArticleViewModel = new SubArticleViewModel();

定义为资源的DataTemplate将被置于控制内容中。
上面的出路创造了大量的工作,更容易被遗漏。无论如何,PRISM将是一个更好的选择。

答案 1 :(得分:0)

  1. 使用 static ctor创建AppViewModel类,如下所示:

    class AppViewModel : BaseViewModel 
    {
        static AppViewModel() 
        {
            _AppModel = new AppViewModel();
        }
    
        private static AppViewModel _AppModel;
    
        public static AppViewModel Current 
        {
            get { return _AppModel;  }
        }
    
        private AppViewModel()
        {
            //Initialize view models here
            MainPageModel = new MainPageViewModel();
        }
    
        //VIEW MODELS
    
        public MainPageViewModel MainPageModel { get; private set; }
    }
    
  2. 创建BaseViewModel类。你的所有VM都应该从它继承:

    class BaseViewModel //implement INotifyPropertyChanged if needed
    {
        public AppViewModel AppModel 
        {
            get { return AppViewModel.Current; }
        }
    }
    
  3. 现在您可以创建名为“MainView”的UserControl:

    public partial class MainView : UserControl
    {
        public MainView()
        {
            InitializeComponent();
            //Prevent view updating in Designer
            if (DesignerProperties.GetIsInDesignMode(this))
            {
                return;
            }
    
            var mainVM = AppViewModel.Current.MainPageModel;
            DataContext = mainVM;
        }
    }
    
  4. 在MainWindow.xaml中:

    <Window x:Class="MVVM_Test.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:views="clr-namespace:MVVM_Test.Views"
            Title="MainWindow" Height="350" Width="525">
        <views:MainView />
    </Window>