将ViewModel绑定到CustomControl

时间:2017-07-09 09:27:37

标签: c# wpf mvvm viewmodel

我的主窗口有侧边栏菜单。单击菜单上的项目时,我将在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框架的实现有问题。请告诉我我出错的部分是什么,以及实施这个部分的最佳方式。

1 个答案:

答案 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绑定到此属性。