Многократное связывание с RelayCommand в WPF MVVM Light - PullRequest
0 голосов
/ 16 мая 2019

Я начал работать с WPF MVVM Light, и теперь я пытаюсь перемещаться между страницами.

В главном окне я добавил «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 голосов
/ 13 июня 2019

Убедитесь, что вы используете RelayCommand в GalaSoft.MvvmLight.CommandWpf, а не в GalaSoft.MvvmLight.Command.RelayCommand

0 голосов
/ 16 мая 2019

Возможно, вам вообще не следует возвращаться.

Если вы действительно не хотите использовать журнал, использование фрейма и страниц - плохая идея. Это редкое требование, чтобы вернуться к последнему представлению в настольных приложениях. Что с ними не веб браузер.

Возможно, у вас есть это требование.

Если у вас есть фрейм, у вас есть его журнал, и вы можете просто вызвать 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?

Когда вы возвращаетесь назад, что именно происходит?

Когда вы во второй раз щелкаете по возврату, по какому пути он идет, и в каком состоянии это происходит.

...