简体   繁体   English

WPF MVVM导航来自同一层次级别的视图

[英]WPF MVVM Navigate betweel views from the same hierarchical level

I am trying to make a small program mainly to learn MVVM. 我正在尝试制作一个小程序,主要是为了学习MVVM。 Its a small Book Library. 它是一个小型图书馆。

I have 4 views(and 4 viewmodels). 我有4个视图(和4个视图模型)。 MainWindow is the parent view, where i display the other 3 view in a content control. MainWindow是父视图,其中我在内容控件中显示另外3个视图。

The other 3 child views are HomeView, BookManagingView, ReaderManagingView. 其他3个子视图是HomeView,BookManagingView,ReaderManagingView。

In HomeView, i display 2 ListViews(one with readers, one with books), and in the other 2 views i edit/add books or readers. 在HomeView中,我显示2个ListViews(一个有读者,一个有书),另外两个视图我编辑/添加书籍或读者。

In my HomeView i also have 2 buttons. 在我的HomeView中我也有2个按钮。 When i click the buttons i want to switch from the HomeView, to BookManagingView or ReaderManagingView. 当我单击要从HomeView切换到BookManagingView或ReaderManagingView的按钮时。

If i am trying to switch to any of the Views from the MainWindow, it works. 如果我试图切换到MainWindow的任何视图,它的工作原理。

What i am trying to do is to switch from the HomeView, to BookManagingView or ReaderManagingView. 我想要做的是从HomeView切换到BookManagingView或ReaderManagingView。 How can i achieve that? 我怎样才能实现这一目标?

MainWindow: 主窗口:

    <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: 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: 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: 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();
    }

Book & Reader ManagingViews have a bunch of textboxes and buttons for adding, deleting to/from database. Book&Reader ManagingViews有一堆文本框和按钮,用于添加,删除数据库或从数据库删除。

Book & Reader ManagingVM have methods for adding/deleting to/from database(right now they are empty and i will finish them if i manage to solve this problem first) Book&Reader ManagingVM有添加/删除数据库的方法(现在它们是空的,如果我先设法解决这个问题,我将完成它们)

I have tried to navigate from HomeView to Book/ReaderManagingView with the EditBook/ReaderSwitch commands and EditBook/ReaderInfo() methods, but it doesnt work. 我尝试使用EditBook / ReaderSwitch命令和EditBook / ReaderInfo()方法从HomeView导航到Book / ReaderManagingView,但它不起作用。

What am i doing wrong, and what should i do to fix it? 我做错了什么,我该怎么做才能解决它?

Sorry for the long post. 对不起,很长的帖子。

You need to set the CurrentView property of the existing MainWindowViewModel instance. 您需要设置现有 MainWindowViewModel实例的CurrentView属性。 Right now you are creating a new instance of the class. 现在您正在创建该类的实例。

You could inject the HomeViewModel with a MainWindowViewModel : 您可以使用MainWindowViewModel注入HomeViewModel

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

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

MainWindowViewModel: MainWindowViewModel:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM