堆栈溢出社区您好, 我是 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.'
}
}
更新: 我已经实现了 MS Toolkit Messages,它比我想象的要简单得多。