2017-04-02 58 views
1

我正在嘗試製作一個主要用於學習MVVM的小程序。它是一個小書庫。WPF MVVM從同一等級級別瀏覽視圖

我有4個視圖(和4個viewmodels)。 MainWindow是父視圖,其中我在內容控件中顯示其他3視圖。

其他3個子視圖是HomeView,BookManagingView,ReaderManagingView。

在HomeView中,我顯示2個ListViews(一個帶有閱讀器,一個帶有書本),另外兩個視圖中我編輯/添加書籍或閱讀器。

在我的HomeView中,我也有2個按鈕。當我點擊我想從HomeView切換到BookManagingView或ReaderManagingView的按鈕時。

如果我試圖從MainWindow切換到任何視圖,它的工作原理。

我想要做的是從HomeView切換到BookManagingView或ReaderManagingView。我怎麼能做到這一點?

主窗口:

<Grid> 
    <ContentControl Content="{Binding CurrentView}" Height="340" Width="500" /> 
    <Button x:Name="btnHomeView" Content="Home" Command="{Binding ChangeViewToHomeView, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Left" Margin="16,70,0,0" VerticalAlignment="Top" Width="75"/> 
    <Button x:Name="btnBookManagingView" Content="Reader Options" Command="{Binding ChangeViewToReaderManagView,UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Left" Margin="96,70,0,0" VerticalAlignment="Top" Width="92"/> 
    <Button x:Name="btnReaderManagingView" Content="Books Options" Command="{Binding ChangeViewToBookManagView,UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Left" Margin="193,70,0,0" VerticalAlignment="Top" Width="92"/> 
</Grid> 

MainWindowVM:

public class MainWindowViewModel : ViewModelBase 
{ 
    private object currentView; 
    private HomeViewModel homeVM; 
    private ReaderManagingViewModel readerManagingVM; 
    private BookManagingViewModel bookManagingVM; 


    public MainWindowViewModel() 
    { 
     homeVM = new HomeViewModel(); 
     readerManagingVM = new ReaderManagingViewModel(); 
     bookManagingVM = new BookManagingViewModel(); 
     CurrentView = homeVM; 

     ChangeViewToHomeView = new DefCommand(DisplayHomeView); 
     ChangeViewToReaderManagView = new DefCommand(DisplayReaderManagingView); 
     ChangeViewToBookManagView = new DefCommand(DisplayBookManagingView); 
    } 

    public DefCommand ChangeViewToHomeView { get; private set; } 
    public DefCommand ChangeViewToReaderManagView { get; private set; } 
    public DefCommand ChangeViewToBookManagView { get; private set; } 


    public object CurrentView 
    { 
     get { return currentView; } 
     set { currentView = value; RaisePropertyChanged(); } 
    } 

    public void DisplayHomeView() 
    { 
     CurrentView = homeVM; 
    } 

    public void DisplayReaderManagingView() 
    { 
     CurrentView = readerManagingVM; 
    } 

    public void DisplayBookManagingView() 
    { 
     CurrentView = bookManagingVM; 
    } 

HomeView:

<Grid> 
    <ListView x:Name="listviewReaders" ItemsSource="{Binding ReadersList}" SelectedItem="{Binding SelectedReader, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Width="160" Margin="25,23,315,40"> 

...

<ListView x:Name="listviewBooks" ItemsSource="{Binding BookList, Mode=OneWay}" SelectedItem="{Binding SelectedBook, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Width="160" Margin="316,50,24,117"> 

...

<Button x:Name="btnEditReader" Command="{Binding EditReaderSwitch, UpdateSourceTrigger=PropertyChanged}" Content="EditR" HorizontalAlignment="Left" Margin="316,305,0,0" VerticalAlignment="Top" Width="74"/> 
    <Button x:Name="btnEditBook" Command="{Binding EditBookSwitch, UpdateSourceTrigger=PropertyChanged}" Content="EditB" HorizontalAlignment="Left" Margin="402,305,0,0" VerticalAlignment="Top" Width="74"/> 
</Grid> 

HomeVM:

private Reader selectedReader; 
    private Book selectedBook; 
    private BookListFilter selectedFilter; 

    private ObservableCollection<Book> bookList; 
    private ObservableCollection<Reader> readerList; 
    private IEnumerable<BookListFilter> bookLstItemSrc; 

    public HomeViewModel() 
    { 
     SelectedReader = new Reader(); 
     SelectedBook = new Book(); 
     SelectedFilter = BookListFilter.AllBooks; 

     BookDBDataContext rdb = new BookDBDataContext(); 

     ReadersList = new ObservableCollection<Reader>(rdb.Readers); 
     GetBookList(); 

     EditReaderSwitch = new DefCommand(EditReaderInfo); 
     EditBookSwitch = new DefCommand(EditBookInfo); 
    } 

    public DefCommand EditReaderSwitch { get; private set; } 
    public DefCommand EditBookSwitch { get; private set; } 
private void EditBookInfo() 
    { 
     var tmpBook = new BookManagingViewModel(this); 
     var tmpMwvm = new MainWindowViewModel(); 
     tmpMwvm.DisplayBookManagingView(); 
    } 

    private void EditReaderInfo() 
    { 
     var tmpReader = new ReaderManagingViewModel(this); 
     var tmpMwvm = new MainWindowViewModel(); 
     tmpMwvm.DisplayReaderManagingView(); 
    } 

書&讀者ManagingViews有增加,從數據庫中刪除到/一堆文本框和按鈕。

書&讀者ManagingVM有添加方法/從數據庫中刪除以/(現在他們是空的,我會完成他們,如果我設法解決這個問題第一)

我試圖從HomeView到導航Book/ReaderManagingView與EditBook/ReaderSwitch命令和EditBook/ReaderInfo()方法,但它不起作用。

我在做什麼錯,我應該怎麼做才能解決它?

對不起,很長的文章。

+0

它看起來像內容控件綁定到CurrentView,但是從你的MainWindowVM CurrentView實際上是指向一個視圖模型,而不是相應的視圖(或XAML控件來顯示UI)。 DisplayBookManagingView方法實際上做了什麼? –

+0

它將CurrentView更改爲BookManagingView(或至少這是我正在嘗試使用它,它似乎工作) – Alex

回答

0

您需要設置現有MainWindowViewModel實例的CurrentView屬性。現在你正在創建一個新的類的實例。

你可以注入HomeViewModelMainWindowViewModel

private readonly MainWindowViewModel _x; 
public HomeViewModel(MainWindowViewModel x) 
{ 
    _x = x; 
    SelectedReader = new Reader(); 
    ... 
} 

private void EditBookInfo() 
{ 
    _x.DisplayBookManagingView(); 
} 

MainWindowViewModel:

public MainWindowViewModel() 
{ 
    homeVM = new HomeViewModel(this); 
} 
+0

謝謝,我會試試這個。如果我仍然有問題,我應該張貼在這裏或問一個新的問題? – Alex

+0

我試過了,它工作。非常感謝你! – Alex