gpt4 book ai didi

wpf - 具有直接ViewModel切换的WPF/MVVM导航

转载 作者:行者123 更新时间:2023-12-03 10:22:40 29 4
gpt4 key购买 nike

我已经开始编写我的第一个WPF/MVVM,并且正如许多其他人所发现的那样,处理 View 之间的导航非常令人困惑。

我一直在搜索一段时间,大多数主题都建议使用MVVM Light/PRISM,或者提供与here类似的解决方案。

我正在尝试一种MVVM导航机制,在该机制中,我可以直接从一个 View 切换到另一个 View (无需使用父窗口中的datatemplate开关)。假设,我有一个带有主窗口的应用程序,该窗口从不同的用户控件( View )加载动态内容。

MainWindowViewModel具有一个指向UserListV的CurrentV属性和一个指向UserListVM的CurrentVM属性。现在,我从列表中选择一个用户,然后单击“查看”按钮以在同一窗口的另一个屏幕中查看该用户的详细信息。这应该允许我使用UserVM作为数据上下文切换到UserV。

我想知道在UserListVM上时如何调用MainWindowViewModel来更新CurrentV和CurrentVM值,并相应地将窗口切换到UserV?

任何更好的想法的建议都将受到欢迎!

非常感谢你!

最佳答案

我使用消息传递服务在ViewModel之间进行通信,同时仍保持它们之间的分离。如果您使用的是MVVMLight,则它附带一个。我不想使用MVVM框架,而是编写自己的消息传递服务。这是一个来自最近项目的示例:

public class MessageService : IMessageService
{
private List<IMessageSubscription> subscribers; //list of subscription objects registered

public MessageService()
{
subscribers = new List<IMessageSubscription>();
}

public void Subscribe<T>(string message, Action<T> action)
{
subscribers.Add(new MessageSubscription<T>()
{
Message = message,
MessageActionWithArgs = action
});
}

public void Subscribe(string message, Action action)
{
subscribers.Add(new MessageSubscription<bool>()
{
Message = message,
MessageActionNoArgs = action
});
}

public void Send<T>(string message, T args)
{
IEnumerable<IMessageSubscription> matches = subscribers.Where(x => x.Message == message && x.PayLoadType == typeof(T));

foreach (IMessageSubscription sub in matches.ToList())
{
sub.InvokeMessageAction((T)args);
}
}

public void Send(string message)
{
IEnumerable<IMessageSubscription> matches = subscribers.Where(x => x.Message == message);

foreach (IMessageSubscription sub in matches.ToList())
{
sub.InvokeMessageAction();
}
}
}

因此,例如,MainViewModel将监听诸如“ActiveViewModelChangeRequest”之类的消息,而其他 View 模型将在需要激活时发送该消息。因此,在MainViewModel中,您将具有以下内容:
public MainViewModel()
{
messageService.Register<ViewModelBase>("ActiveViewModelChangeRequest", UpdateActiveViewModel);
}

private void UpdateActiveViewModel(ViewModelBase viewModel)
{
this.CurrentVM = viewModel;
}

然后在UserListVM中,您将拥有:
private void OnUserSelect(object sender, UserSelectionEventArgs e)
{
UserVM viewModel = new UserVM(SelectedUser);
messageService.Send<ViewModelBase>("ActiveViewModelChangeRequest, viewModel);
}

在Messenger模式中,有很多关于MVVM应用程序的阅读 Material 。我建议阅读一下。

关于wpf - 具有直接ViewModel切换的WPF/MVVM导航,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34532369/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com