我的主窗口有侧边栏菜单。单击菜单上的项目时,我将在ContentControl上呈现该项目的页面(UserControl)。这是它的样子。
我的MainViewModel
public MainViewModel()
{
SystemMenu = new List<SystemMenuViewModel>();
SystemMenu.Add(new SystemMenuViewModel("Dashboard", new Dashboard()));
SystemMenu.Add(new SystemMenuViewModel("Appointments", new Dashboard()));
SystemMenu.Add(new SystemMenuViewModel("Reports", new Reports()));
SystemMenu.Add(new SystemMenuViewModel("Configuration", new Configuration()));
}
private string _windowTitle = GlobalVariables.WindowTitleDefault;
private string _currentPage = "Dashboard";
public string WindowTitle
{
get { return _windowTitle; }
set
{
_windowTitle = value;
NotifyOfPropertyChange(() => WindowTitle);
}
}
public string CurrentPage
{
get { return _currentPage; }
set
{
_currentPage = value;
NotifyOfPropertyChange(() => CurrentPage);
}
}
public List<SystemMenuViewModel> SystemMenu { get; set; }
我的SystemMenuViewModel
private string _name;
private object _content;
public SystemMenuViewModel(string name, object content)
{
_name = name;
Content = content;
}
public string Name
{
get { return _name; }
set { this.MutateVerbose(ref _name, value, RaisePropertyChanged()); }
}
public object Content
{
get { return _content; }
set { this.MutateVerbose(ref _content, value, RaisePropertyChanged()); }
}
public event PropertyChangedEventHandler PropertyChanged;
private Action<PropertyChangedEventArgs> RaisePropertyChanged()
{
return args => PropertyChanged?.Invoke(this, args);
}
渲染部分的我的MainView
<ContentControl Content="{Binding ElementName=lstSystemMenu, Path=SelectedItem.Content}" />
我的主要问题是我只是在MainView上呈现内容而没有实际调用或绑定其ViewModel。
我确信我的MVVM框架的实现有问题。请告诉我我出错的部分是什么,以及实施这个部分的最佳方式。
答案 0 :(得分:0)
看看这个:https://msdn.microsoft.com/en-us/magazine/dd419663.aspx 无法找到源zip,但文章中有大量代码示例。
您需要将ContentControl的内容属性绑定到ViewModel / Model对象,使用DataTemplates根据datacontext创建正确的页面 。 datatemplates只需要存储在ResourceDictionary中,可以是ContentControl,也可以是某些上层控件(甚至应用程序)。 DataTemplates必须设置一个DataType才能生效。
另外,正如您对问题的评论中所建议的那样,视图模型不应该有&#34;内容&#34;类型对象的属性。它看起来像你的内容&#34; property是一个视图对象或东西。如果没有向我们展示更多代码,我们就无法知道。 ViewModel不应引用任何View对象。但View可以在代码隐藏或XAML中引用ViewModel类。
有两种方法可以绑定到&#34;当前选择&#34;。 使用&#34;当前选择&#34;视图列表中的信息(例如 SelectedItem ),或在MainViewModel中添加属性(例如: SelectedViewModel ,然后将ContentControl绑定到此属性。