【问题标题】:Prism do not re-navigate to active view棱镜不会重新导航到活动视图
【发布时间】:2016-10-10 06:55:37
【问题描述】:

我在 WPF 应用程序中使用 prism。 我想在属性更改时导航到“SearchResultsView”,但前提是视图不是活动视图

这是我的代码:

public string SearchString
{
    get { return _searchString; }
    set
    {
        if (_searchString != value)
        {
            _searchString = value;

            _regionManager.RequestNavigate(RegionNames.ContentRegion, "SearchResultsView");

            OnPropertyChanged();
        }
    }
}

第一次导航时没问题。 但每次更改 searchString 时,它仍会重新导航到相同的活动视图。

我正在模块 Init() 中注册视图,如下所示:

_container.RegisterTypeForNavigation<SearchResultsView>();

因为我使用的是 MVVM,所以我无法在导航之前检查活动视图,如下所示:

var activeView = _regionManager.Regions[RegionNames.ContentRegion].ActiveViews.FirstOrDefault();

这样做的正确代码是什么? (要求“SearchResultsView”而不是它的类型会满足)

【问题讨论】:

    标签: c# wpf mvvm navigation prism


    【解决方案1】:

    最简单的解决方案是在 SearchResultsView 或 ViewModel 中实现 IRegionMemberLifetime,如下所示:

    public class SearchResultsViewModel : BindableBase, IRegionMemberLifetime
    {
        // Stuff...
    
        public bool KeepAlive => false;
    }
    

    如果导航离开,这将导致 Prism 破坏区域内容。


    否则你可以实现 INavigationAware 来检查搜索字符串是否不同:

    public string SearchString
    {
        get { return _searchString; }
        set
        {
            if (_searchString != value)
            {
                _searchString = value;
    
                var navigationParams = new NavigationParameters {{ "searchString", _searchString }};
                _regionManager.RequestNavigate(RegionNames.ContentRegion, "SearchResultsView", navigationParams);
    
                OnPropertyChanged();
            }
        }
    }
    
    // --------------------------------------------------------------------
    
    public class SearchResultsViewModel : BindableBase, INavigationAware
    {
        private string _searchString;
    
        public void OnNavigatedTo(NavigationContext navigationContext)
        {
            _searchString = navigationContext.Parameters["searchString"] as string;
        }
    
        public bool IsNavigationTarget(NavigationContext navigationContext)
        {
            var searchString = navigationContext.Parameters["searchString"] as string;
            return _searchString.Equals(searchString);
        }
    
        public void OnNavigatedFrom(NavigationContext navigationContext)
        {
            // Ignored
        }
    }
    

    如果搜索字符串不同,这将告诉 Prism 每次创建一个新实例,否则将显示现有实例。

    警告:但这可能会导致 MemoryLeak,因为如果搜索字符串不匹配,您可能会创建许多视图实例,因此您需要手动清理它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-16
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 2021-11-01
      相关资源
      最近更新 更多