我已经开始使用WPF MVVM Light,现在我正试图在页面之间导航。
在MainWindow中,我添加了一个“ BackButton”
<Button Command='{Binding Main.GoBack, Mode=OneWay}' />
绑定到MainViewModel方法“ RelayCommand GoBack”。
private RelayCommand _goBack;
public RelayCommand GoBack
{
get
{
return _goBack
?? (_goBack = new RelayCommand(
() =>
_navigationService.GoBack();
}));
}
}
为什么此按钮仅更改视图一次?如果我想点击它秒 它不起作用(什么都没发生)。如果我通过另一个按钮将页面更改为另一个页面,则它只能一次又一次地开始工作。
FrameNavigationService的实现部分:
public FrameNavigationService()
{
_pagesByKey = new Dictionary<string, Uri>();
_historic = new List<string>();
}
public void GoBack()
{
if (_historic.Count > 1)
{
_historic.RemoveAt(_historic.Count - 1);
NavigateTo(_historic.Last(), null);
}
}
public void NavigateTo(string pageKey)
{
NavigateTo(pageKey, null);
}
public virtual void NavigateTo(string pageKey, object parameter)
{
lock (_pagesByKey)
{
if (!_pagesByKey.ContainsKey(pageKey))
{
throw new ArgumentException(string.Format("No such page: {0} ", pageKey), "pageKey");
}
var frame = GetDescendantFromName(Application.Current.MainWindow, "MainFrame") as Frame;
if (frame != null)
{
frame.Source = _pagesByKey[pageKey];
}
Parameter = parameter;
_historic.Add(pageKey);
CurrentPageKey = pageKey;
}
}
我该怎么办?可能我应该完全一样吗?
答案 0 :(得分:0)
您可能根本不应该做goback。
除非您真的想使用日记,否则使用框架和页面是个坏主意。返回桌面应用程序中的最后一个视图非常罕见。他们不是网络浏览器吗?
也许您有这个要求。
如果您有框架,那么就拥有日记本,您可以在框架的导航服务上调用goback。 https://docs.microsoft.com/en-us/dotnet/api/system.windows.navigation.navigationservice.goback?view=netframework-4.8
您在页面上设置了keepalive。 https://docs.microsoft.com/en-us/dotnet/api/system.windows.controls.page.keepalive?view=netframework-4.8
您编写了该代码,它似乎在很大程度上重现了navigationservice功能。根据您向我们展示的内容。
原样。
使用类型而不是魔术字符串作为键。在编译时会检查类型,而不会在魔术字符串中检查类型,您可能会出错。
您有没有探讨过这个问题?我认为,也许这只是告诉某人他们做错了什么事,实际上并没有告诉他们应该如何诊断。
调试是任何开发人员的关键技能。
您的代码正在运行。
插入中断点,逐步检查并检查发生的情况。
导航时,以_historic结尾的内容是什么?
回去时,究竟会发生什么?
当您第二次单击goback时,它会走哪条路径以及导致该状态的状态。
答案 1 :(得分:0)
确保您在GalaSoft.MvvmLight.CommandWpf中使用了RelayCommand,而不是在GalaSoft.MvvmLight.Command.RelayCommand中使用