MVVM 导航 | View 内的按钮

问题描述 投票:0回答:1

堆栈溢出社区您好, 我是 MVVM 的新手,并且已经编写了一些教程来了解一些基础知识(绑定、RelayCommand 等)。 到目前为止,单个窗口应用程序运行得很好,但现在我需要添加一个登录名和一两个其他“视图”。我没想到会这么痛苦......:D

在完成来自(Github)的教程之后,我可以弄清楚,如果我将一个按钮/命令从 MainWindow.xaml 例如放置到 /view/Home.xaml,该命令仍然会触发,CurrentView 也会更新,但主窗口不更新/显示?所以......我对发生的事情感到非常困惑,希望有人有一个合乎逻辑的解释。

在研究了更多有关堆栈溢出的示例之后,我正在阅读有关 MVVM 轻量级和消息传递的内容,这是使事情正常工作的方法吗?如果是这样,有人可以举一个简单的例子吗?不确定是否存在一个简单的例子..

非常感谢, 任何事情都有帮助

亚历克斯

PS:我已经更新了我的导航测试存储库 github.com,它准确地显示了问题。 希望有一个简单的解决方案:D

更新:

我更新了我的代码并得出结论,我需要使用 MVVM-light 消息传递或 Prism Event Aggregator。

我决定尝试一下 Prism 事件聚合器,并“尝试”实现该接口,并在两个视图模型的构造函数中添加聚合器,但现在我的整个解决方案不再起作用。 我在这里做错了什么?

NavigationViewModel.cs

public class NavigationViewModel : ViewModelBase
{
    private IEventAggregator _eventAggregator;

    public NavigationViewModel(IEventAggregator eventAggregator)
    {
        LoginCommand = new RelayCommand(Login);
        PwResetCommand = new RelayCommand(PwReset);
        LogoutCommand = new RelayCommand(Logout);


        // Startup Page
        CurrentView = new LoginViewModel();

        //Prism Event Aggregator
        _eventAggregator = eventAggregator;

        eventAggregator
        .GetEvent<MyEvent>()
        .Publish(true);
    }

    public class MyEvent : PubSubEvent<bool>
    {  
    }

WorkOrderViewModel.cs

    public class WorkOrderViewModel : ViewModelBase
{
    private IEventAggregator _eventAggregator;

    public WorkOrderViewModel(IEventAggregator eventAggregator)
    {
        // Prism Event Aggregator
        _eventAggregator = eventAggregator;

        eventAggregator
        .GetEvent<NavigationViewModel.MyEvent>()
        .Subscribe(OnIsSavedEvent);
    }

    public void OnIsSavedEvent(bool isSaved)
    {
        bool IsModified = !isSaved;
    }
}

NavigationView.xaml.cs:

public partial class NavigationView : UserControl
{
    public NavigationView()
    {
        InitializeComponent(); // <-- System.NullReferenceException: 'Object reference not set to an instance of an object.'
    }
}
c# wpf mvvm navigation eventaggregator
1个回答
0
投票

更新: 我已经实现了 MS Toolkit Messages,它比我想象的要简单得多。

© www.soinside.com 2019 - 2024. All rights reserved.