C# WPF MVVM在同一层次结构级别的视图之间导航

C# WPF MVVM在同一层次结构级别的视图之间导航,c#,wpf,mvvm,C#,Wpf,Mvvm,我正在尝试做一个小程序,主要是学习MVVM。这是一个小型图书图书馆 我有4个视图(和4个视图模型)。 MainWindow是父视图,我在其中显示内容控件中的其他3个视图 其他3个子视图是HomeView、BookManager视图、ReaderManager视图 在HomeView中,我显示了两个列表视图(一个带阅读器,一个带书籍),在其他两个视图中,我编辑/添加书籍或阅读器 在我的HomeView中,我还有两个按钮。单击要从HomeView切换到BookManager视图或ReaderMana

我正在尝试做一个小程序,主要是学习MVVM。这是一个小型图书图书馆

我有4个视图(和4个视图模型)。 MainWindow是父视图,我在其中显示内容控件中的其他3个视图

其他3个子视图是HomeView、BookManager视图、ReaderManager视图

在HomeView中,我显示了两个列表视图(一个带阅读器,一个带书籍),在其他两个视图中,我编辑/添加书籍或阅读器

在我的HomeView中,我还有两个按钮。单击要从HomeView切换到BookManager视图或ReaderManager视图的按钮时

如果我试图从主窗口切换到任何视图,它都可以工作

我试图做的是从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>
HomeView:

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

。。。


。。。


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();
    }
private Reader selectedReader;
私人图书精选图书;
private BookList Filter Selected Filter;
私人可观测收集书目;
私有可观察收集阅读器列表;
私有IEnumerable bookstitemsrc;
公共HomeViewModel()
{
SelectedReader=新读卡器();
SelectedBook=新书();
SelectedFilter=BookListFilter.AllBooks;
BookDBDataContext rdb=新的BookDBDataContext();
ReadersList=新的可观察集合(rdb.Readers);
GetBookList();
EditReaderSwitch=新的DefCommand(EditReaderInfo);
EditBookSwitch=new DefCommand(EditBookInfo);
}
public def命令EditReaderSwitch{get;private set;}
public def命令EditBookSwitch{get;private set;}
私有无效EditBookInfo()
{
var tmpBook=新的BookManagingViewModel(此);
var tmpMwvm=新的MainWindowViewModel();
tmpMwvm.DisplayBookManagingView();
}
私有void editerinfo()
{
var tmpReader=新的ReaderManagingViewModel(此);
var tmpMwvm=新的MainWindowViewModel();
tmpMwvm.DisplayReaderManagingView();
}
图书和读者管理视图有一组文本框和按钮,用于向数据库添加、删除或从数据库中删除

图书和读者管理VM有向数据库添加/删除或从数据库中删除的方法(现在它们是空的,如果我先设法解决这个问题,我将完成它们)

我曾尝试使用EditBook/ReaderSwitch命令和EditBook/ReaderInfo()方法从HomeView导航到Book/ReaderManagingView,但不起作用

我做错了什么,我应该怎么做来修复它


很抱歉发了这么长的帖子。

您需要设置现有
MainWindowViewModel
实例的
CurrentView
属性。现在您正在创建该类的新实例

您可以将
MainWindowViewModel
注入
HomeViewModel

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

您需要设置现有
MainWindowViewModel
实例的
CurrentView
属性。现在您正在创建该类的新实例

您可以将
MainWindowViewModel
注入
HomeViewModel

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

看起来内容控件绑定到了CurrentView,但从MainWindowVM来看,CurrentView实际上指向的是一个视图模型,而不是相应的视图(或显示UI的XAML控件)。DisplayBookManagingView方法实际上是做什么的?它将CurrentView更改为BookManagingView(或者至少我正试图用它来做这件事,而且它似乎可以工作)。看起来内容控件绑定到CurrentView,但是从主窗口VM CurrentView实际上指向一个视图模型,而不是对应的视图(或显示UI的XAML控件)。DisplayBookManagingView方法实际上做什么?它将CurrentView更改为BookManagingView(或者至少我正试图用它来做这件事,它似乎可以工作)谢谢,我会试试这个。如果我仍然有问题,我应该在这里发帖还是问一个新问题?谢谢,我会试试这个。如果我仍然有问题,我应该在这里发帖还是问一个新问题?
public MainWindowViewModel()
{
    homeVM = new HomeViewModel(this);
}