在WPF MVVM Light中多重绑定到RelayCommand

时间:2019-05-16 08:31:53

标签: c# wpf mvvm mvvm-light relaycommand

我已经开始使用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;
        }
    }

我该怎么办?可能我应该完全一样吗?

2 个答案:

答案 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中使用