【问题标题】:WPF MVVM navigation conflicting each otherWPF MVVM导航相互冲突
【发布时间】:2019-07-10 07:42:17
【问题描述】:

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

主窗口:

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

【问题讨论】:

  • 共享窗口代码怎么编译?你有一个主窗口的ctor。我建议使用一个窗口 - 主窗口来托管对话框以外的内容。和。不要使用框架和页面。 social.technet.microsoft.com/wiki/contents/articles/…
  • 我正在使用 MVVM,所以我不能使用一个窗口。这就是我陷入困境的原因
  • 你写的不是真正的 MVVM 代码。将 ShareWindow 重命名为 MainWindowViewModelMainViewModel。您的MainWindow 类不应构造或分配DataContextShareWindow 不应构造 MainWindow(这是在 App.xaml.cs 内部完成的)。
  • 您的代码包含许多错误,无法编译且与您的描述不符。请再次仔细阅读您的问题,然后以代码说明您的问题 (minimal reproducible example) 并且正确的方式对其进行编辑。最后,陈述你的问题,简洁明了(目前你的帖子中没有问题)。
  • @logcat 这不是 MVVM 实现。您正在编写错误的代码。在MainViewModel 中,您应该获取适当的属性,然后将它们绑定到视图中。

标签: c# wpf datacontext


【解决方案1】:

使用 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 的任何通信都应该使用事件来保持它们的解耦。

【讨论】:

  • 我写的关于卡在循环中的内容。你能写出适当的答案吗?
猜你喜欢
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 2015-06-04
  • 2016-07-29
  • 2013-11-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多