2017-07-09 114 views
-1

我的主窗口有一個側邊欄菜單。當單擊菜單上的項目時,我將在ContentControl上呈現該項目的頁面(UserControl)。這是它的樣子。將ViewModel綁定到CustomControl

我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); 
} 

我在渲染部分

<ContentControl Content="{Binding ElementName=lstSystemMenu, Path=SelectedItem.Content}" /> 

我的主要問題的MainView是,我只是呈現在我的MainView的內容,也不得實際調用或綁定其ViewModel。

我確信在我的MVVM框架的實現中有些問題。請告訴我我出錯的部分是什麼,以及實施這一部分的最佳方式是什麼。

+0

什麼類型。 'Dashboard','Reports','Configuration' ...?他們是其他視圖模型,還是他們的UI元素?如果你想遵循MVVM模式,那麼視圖模型不應該有任何UI元素。相信系統菜單應該是視圖層的一部分,或者至少是一個服務 –

+0

這些是視圖(UserControl)。你可以幫助我如何顯示這些視圖,當一個菜單項被點擊時沒有按照我現在做的方式?哦,什麼是服務? – manoyanx

+0

沒有好的[mcve]能夠可靠地再現問題並更準確地描述問題,因此無法寫出對此問題的正確答案。請不要將問題發佈到Stack Overflow,直到您閱讀介紹性信息,包括[Tour](https://stackoverflow.com/tour)和其他關於[Asking]的文章(https://stackoverflow.com/幫助/詢問)在[幫助中心](https://stackoverflow.com/help) –

回答

0

看一看這個:https://msdn.microsoft.com/en-us/magazine/dd419663.aspx 找不到源zip,但文章有大量的代碼示例。

你需要的是你的ContentControl中的內容屬性綁定到一個ViewModel/Model對象,並使用來的DataTemplates創建視的datacontext正確的頁面。數據模板只需要存儲在ResourceDictionary中,或者是ContentControl或者一些上層控件(甚至是應用程序)。 DataTemplates必須有一個DataType設置才能工作。

此外,正如您對問題的評論中所建議的那樣,viewmodels不應該具有object類型的「content」屬性。它看起來像你的「內容」屬性是一個視圖對象或東西。不知道沒有你向我們展示更多的代碼。 ViewModel不應該引用任何View對象。但View可以在代碼隱藏或XAML中引用ViewModel類。

有兩種方式綁定到「當前選擇」。 或者使用從視圖列表(的SelectedItem例如)「當前選擇」信息,或者在MainViewModel(例如添加屬性:SelectedViewModel,然後綁定ContentControl中這個屬性

+0

感謝您指點我正確的方向。我終於明白了。 我對MVVM的理解顯然很淺。我很抱歉,如果有人在這裏很難理解我的問題,特別是@彼得Duniho 我想我會繼續潛伏,而不是直接問自己的問題。 – manoyanx

+0

沒問題,MVVM起初可能很難找對。現在你的view/viewmodel問題已經排序了,你將進入某些類所屬的困境。模型還是Viewmodel?我是否使用實現propertychange的類似viewmodel類來包裝每個模型? SO有很多答案。請記住,MVVM不僅適用於WPF。一個好的MVVM項目可以有不同的視圖實現(wpf,winform,uwp,console等),而不需要改變一行共享viewmodel代碼。 –