WP MVVM导航OnNavigatedTO

时间:2013-08-18 08:49:12

标签: windows-phone-8 navigation mvvm-light cimbalino

我开始在我的应用程序中实现MVVM,并且知道用户何时导航到视图。

要在视图之间导航,我可以使用navigationService.Navigate(...);

如何检查导航到视图的时间? 我可以使用活动navigationService.Navigated吗?

是否有其他方法可以像OnNavigatedTo那样使用页面本身提供的方法?

3 个答案:

答案 0 :(得分:1)

XAML:

xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 
xmlns:cmd="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Extras.WP71" 

xmlns:toolkit="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls.Toolkit" 
 DataContext="{Binding titleSearchViewModel, Source={StaticResource Locator}}">
    <i:Interaction.Triggers>
        <i:EventTrigger>
            <cmd:EventToCommand Command="{Binding PageLoaded, Mode=OneWay}"/>
        </i:EventTrigger>
    </i:Interaction.Triggers>

VM:

 private RelayCommand _PageLoaded;
 public RelayCommand PageLoaded
        {
            get
            {
                if (_PageLoaded == null)
                {
                    _PageLoaded = new RelayCommand(
                                    () => Loaded()
                        );
                }
                return _PageLoaded;
            }
        }

答案 1 :(得分:1)

如果这个问题仍然存在,我更喜欢这个解决方案:http://www.geoffhudik.com/tech/2010/10/10/another-wp7-navigation-approach-with-mvvm.html

如果要使用它,可以从发件人ViewModel发送收件人ViewModel的参数:

SendNavigationMessage(Settings.NAVIGATION_PRODUCTS_SUBCATEGORIES, 
    new Dictionary<string, object> { { "SelectedIndex", Int32.Parse(item.id) } });

接收者应该在xaml中定义:

NavigatedToCommand="{Binding RefreshCommand}"

然后在接收者ViewModel中:

public ICommand RefreshCommand // Should be set as NavigatedToCommand="{Binding RefreshCommand}" in xaml
{
    get { return new RelayCommand(Refresh); }
}

public void Refresh()
{       
    _dataService.GetList(SelectedIndex, DownloadedCallback); // So, this would be called automatically after navigating is complete. SelectedIndex is updated at this moment.
}

答案 2 :(得分:0)

感谢您提供的答案。在我决定创建由少数人创建的导航服务的自定义实现之前,两者都是有用的。 然后,我对Cimbalino工具包做出了贡献,建议了这一点,并且它已经被引入了一段时间。

我个人认为,这最能解决我的问题。看看那里的导航服务。 Navigated事件几乎解决了我的问题。

https://github.com/Cimbalino/Cimbalino-Toolkit

它基本上归结为(在你的viewmodel中):

_navigationService.Navigated += OnNavigated;