Silverlight 3 Beta, NavigationService во ViewModel - PullRequest
3 голосов
/ 24 июня 2009

Я занимаюсь разработкой приложения Silverlight 3 для бета-навигации, поэтому я немного изменил шаблон MVVM :) (модель все-в-одном), используя призму и прочее.

Вопрос: Как перейти к другой "NavigationPage" в модели представления

Теперь, если коротко, модель представления объявляется ресурсом страницы.

<navigation:Page.Resources>
    <mvvm:LoginModel x:Key="DataSource" d:IsDataSource="True"></mvvm:LoginModel>
</navigation:Page.Resources>

А затем используется команда для соединения всего с моделью представления

<Button x:Name="LoginButton" Width="100"  Margin="8" Content="Login"
        prism:Click.Command="{Binding LoginCommand}"/>

Теперь, если я попытаюсь перемещаться в любом месте модели представления, вот так

this.NavigationService.Navigate(new Uri("/Views/About.xaml", UriKind.Relative));

Служба навигации пуста, я осмотрелся и нашел эту статью , в которой описывается использование спирали 0.3 для навигации, она была построена еще в дни sl2, когда навигационные элементы управления никогда не существовали, теперь спираль модель работает хорошо, и, внедрив INavigationAware в viewmodel, вы можете получить доступ к NavigationContext, а затем делать все, что вам нужно, я пробовал спираль, и она работает.

SL3 поставляется со встроенной поддержкой навигации, так сказать, которая делает именно то, что делает спираль. Поэтому я не хочу использовать сторонние фреймворки, вместо этого я предпочитаю использовать встроенные функции sl3.

Есть ли в SL3 что-либо, имитирующее интерфейс INavigationAware спирали?

Ответы [ 5 ]

4 голосов
/ 13 сентября 2009

Я лично думаю, что NavigationService - это концепция UI, связанная с UI Frame или Page.

Другой способ сделать это без необходимости передавать NavigationService в модель представления - это заставить ViewModel вызывать событие, когда предполагается, что навигация ... иметь представление, обрабатывать событие модели представления и вызывать Navigate в ответ.

1 голос
/ 13 октября 2010

Вы можете рассмотреть возможность использования системы обмена сообщениями, если вы используете MVVM light. Создайте прослушиватель на своей странице, на котором размещен фрейм, который выполняет навигацию, и отправьте навигационные сообщения с моделей вашего вида.

1 голос
/ 30 июня 2009

Хитрое исправление, но единственное, что я смог использовать, чтобы заставить это работать. В событии OnNavigatedTo в представлении откройте ViewModel и задайте для NavigationService свойство в модели представления, чтобы его можно было использовать позже в модели представления

    protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            ViewModels.LoginViewModel viewmodel = (ViewModels.LoginViewModel)this.Resources["DataSource"];
//DataSource being the x:Name given to the viewmodel that is loaded as a page resource
            viewmodel .service = NavigationService;
        }
0 голосов
/ 08 декабря 2009
NavigationService.Navigate(new Uri("/About", UriKind.Relative));

Выше должно работать.

0 голосов
/ 29 июня 2009

Хорошо, чтобы помочь с моим вопросом, потому что до сих пор не было никакого ответа, я добавлю больше информации.

Это код в модели представления

public LoginModel()
    {
        LoginCommand = new DelegateCommand<object>(LoginCommandExecuted, a => { return _CanLoginCommandExecute; });
    }

    public ICommand LoginCommand { get; private set; }
    private bool _CanLoginCommandExecute = true;
    private void LoginCommandExecuted(object parameter)

    {
        _CanLoginCommandExecute = false;

        AdminClient client = new AdminClient();
        client.AuthorizeAsync();
        client.AuthorizeCompleted += 
        new EventHandler<AsyncCompletedEventArgs>(
                (s, e) =>
                {
                    if (e.Error != null)
                    {
                        MessageBox.Show("Login Failed");
                    }
                    else
                    {
                        this.NavigationService.Navigate(new Uri("/Views/About.xaml", UriKind.Relative));
                    }
                    _CanLoginCommandExecute = true;
                }
                );

    }

NavigationService имеет значение null, поэтому я не могу перейти к следующему представлению, помогите !!!

...