我的问题很简单,我希望有一个MainView,它反过来会有多个动态和难以处理的视图,如下图所示:
但要做到这一点,你需要多个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
请帮帮我,我不知道该怎么办,我现在完全停顿了。
答案 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)
使用 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; }
}
创建BaseViewModel类。你的所有VM都应该从它继承:
class BaseViewModel //implement INotifyPropertyChanged if needed
{
public AppViewModel AppModel
{
get { return AppViewModel.Current; }
}
}
现在您可以创建名为“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;
}
}
在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>