簡體   English   中英

在WPF MVVM Light中多次綁定到RelayCommand

[英]Multiple binding to RelayCommand in WPF MVVM Light

我已經開始使用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;
        }
    }

我該怎么做才能解決這個問題? 也許我應該完全不同?

你根本不應該做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

您編寫了該代碼,它似乎主要是復制導航服務功能。 從你向我們展示的東西。

原樣。

使用類型而不是魔術字符串作為鍵。 在編譯時檢查一個類型,一個魔術字符串不是,你可以犯錯誤。

你有沒有探討過這個問題? 我想也許這是告訴別人他們做錯了什么的時間之一並沒有真正幫助告訴他們應該如何診斷。

調試是任何開發人員的關鍵技能。

你有代碼在你面前運行。

把斷點放進去,逐步檢查發生了什么。

當你導航時,最終會出現在_historic中?

當你goback時,究竟發生了什么?

當您第二次點擊goback時,它會向下移動什么路徑以及導致該狀態的狀態。

確保在GalaSoft.MvvmLight.CommandWpf中使用RelayCommand,而不是在GalaSoft.MvvmLight.Command.RelayCommand中使用

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM