mvvmlight - каков правильный способ выбора параметров URL для модели представления - PullRequest
4 голосов
/ 16 августа 2011

Я просто переключаю проект на mvvmlight и пытаюсь сделать все «правильно»

У меня есть простое приложение со списком

Когда элемент выбран в списке, я подключил RelayCommand

Эта RelayCommand вызывает вызов для INavigationService (http://geekswithblogs.net/lbugnion/archive/2011/01/06/navigation-in-a-wp7-application-with-mvvm-light.aspx), который перемещается по URL-адресу, например "/DetailPage.xaml?DetailId=12"

Затем загружается DetailPage.xaml и ... я немного не уверен ...

  • Каким образом DetailPage должен подключаться к DetailView с DetailId, равным 12?
  • Должен ли я сделать это в Xaml каким-либо образом, используя свойство ViewLocator?
  • я должен сделать это в методе NavigatedTo?

Пожалуйста, не стесняйтесь указывать мне полный пример - конечно, это было сделано (сто) тысяч раз раньше, но все блоги и учебные пособия, похоже, пропускают эту последнюю тривиальную деталь (вместо этого сосредотачиваясь на сообщениях и на навигационном сервисе)

Спасибо!

Ответы [ 2 ]

5 голосов
/ 16 августа 2011

Единственное место, где вы можете получить параметр URL - это вид. Поэтому, поскольку ваше представление, вероятно, зависит от него, вы должны получить его в методе OnNavigatedTo.

Затем вы должны передать его своей модели представления, используя либо обмен сообщениями (слишком дорого, если вы спросите меня), либо обращаясь к своему текстовому тексту (который, как я полагаю, является моделью представления) и выполняя метод для этого.

private AddTilePageViewModel ViewModel
{
    get
    {
        return DataContext as AddTilePageViewModel;
    }
}

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    var postalCode = NavigationContext.TryGetKey("PostalCode");
    var country = NavigationContext.TryGetStringKey("Country");

    if (postalCode.HasValue && string.IsNullOrEmpty(country) == false)
    {
        ViewModel.LoadCity(postalCode.Value, country);
    }

    base.OnNavigatedTo(e);
}

Я использую некоторые специальные расширения для NavigationContext, чтобы упростить его.

namespace System.Windows.Navigation
{
    public static class NavigationExtensions
    {
        public static int? TryGetKey(this NavigationContext source, string key)
        {
            if (source.QueryString.ContainsKey(key))
            {
                string value = source.QueryString[key];

                int result = 0;
                if (int.TryParse(value, out result))
                {
                    return result;
                }
            }

            return null;
        }

        public static string TryGetStringKey(this NavigationContext source, string key)
        {
            if (source.QueryString.ContainsKey(key))
            {
                return source.QueryString[key];
            }

            return null;
        }
    }
}
0 голосов
/ 16 августа 2011

Создайте новое приложение WindowsPhoneDataBound, в нем есть пример того, как обрабатывать навигацию между представлениями. По сути, вы обрабатываете навигационную часть в своем представлении, а затем задаете соответствие DataContext представления для строки запроса. Я думаю, что это хорошо сочетается с шаблоном MVVM, поскольку ваши ViewModels не должны ничего знать о навигации (какой IMO следует обрабатывать на уровне пользовательского интерфейса).

...