WPF MVVM导航相互冲突

时间:2019-02-16 09:18:17

标签: c# wpf datacontext

在我的项目中,我有一个MainViewModel类,该类具有DataContext属性,并使用MainWindow从数据库中的DataContext中加载了MENU。在MainWindow中,我有一个ContentControl来加载UserControl。当我单击“菜单项”时,它应调用MainViewModel的函数以在ContentControl中加载UserControl。在这里我陷入了循环。

MainWindow:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        DataContext = new MainViewModel();            
    }
}

XAML:

<ContentControl x:Name="contentCont1" />

MainViewModel:

public class MainViewModel: ViewModelBase
{
    UCSale ucSale = new UCSale();
    MainWindow mw = new MainWindow(); //IS IT ALLOED ?
    public MainWindow()
    {            
        Window1.contentCont1.Children.Add(ucSale );;
    }
    private void FillMenuItems()
    {
       //LOAD MENU ITEMS FROM DATABASE
    }            
}

1 个答案:

答案 0 :(得分:0)

使用MVVM方法,您的ViewModel(ShareWindow)应该不了解View(MainWindow)。 最重要的是,MainWindow的构造函数是:

public MainWindow()
{
    DataContext = new ShareWindow();            
}

初始化ShareWindow的实例。

ShareWindow的构建涉及:

UCSale ucSale = new UCSale();
MainWindow mw = new MainWindow(); //IS IT ALLOED ?
public MainWindow()
{            
    Window1.contentCont1.Children.Add(ucSale );;
}

实例化MainWindow的实例:MainWindow mw = new MainWindow(); //IS IT ALLOED ?,因此形成了一个循环。

您可以通过简单地从ShareWindow视图模型中删除MainWindow实例来避免这种情况,因为这违反了MVVM模式。从ViewModel到View的任何通讯都应使用事件,以使它们保持解耦状态。