【问题标题】:WP MVVM Navigation OnNavigatedTOWP MVVM 导航 OnNavigatedTO
【发布时间】:2014-09-05 21:29:44
【问题描述】:

我开始在我的应用程序中实现 MVVM,但遇到了知道用户何时导航到视图的问题。

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

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

页面本身提供的像 OnNavigatedTo 这样的其他方法我可以使用吗?

【问题讨论】:

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


    【解决方案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>
    

    虚拟机:

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

    【讨论】:

      【解决方案2】:

      如果这个问题仍然存在,我更喜欢这个解决方案: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.
      }
      

      【讨论】:

        【解决方案3】:

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

        我的个人意见,这最好地解决了我的问题。看看那里的导航服务。导航事件几乎解决了我遇到的问题。

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

        基本上归结为(在您的视图模型中):

        _navigationService.Navigated += OnNavigated;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-11-02
          • 2014-09-21
          • 1970-01-01
          • 2013-03-07
          • 2023-03-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多