2016-10-10 3 views
0

Ich verwende Prisma mit WPF-Anwendung. Ich möchte „SearchResultsView“ auf Eigenschaftsänderung navigieren, aber nur, wenn die Aussicht ist nicht die aktive AnsichtPrism nicht zur aktiven Ansicht wechseln

dies ist mein Code:

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

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

      OnPropertyChanged(); 
     } 
    } 
} 

das erste Mal die Navigation Es ist in Ordnung auftritt. , aber jedes Mal, wenn der searchString geändert wird, navigiert er immer noch zur selben aktiven Ansicht.

ich bin Registrierung die Ansicht im Modul Init() wie folgt:

_container.RegisterTypeForNavigation<SearchResultsView>(); 

da ich MVVM verwende ich nicht für die aktive Ansicht prüfen können kurz vor der Navigation wie folgt aus:

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

Was ist der richtige Code, um das zu tun? (fragt nach „SearchResultsView“ statt seiner Art genügen würde)

Antwort

0

Die einfachste Lösung ist, einfach IRegionMemberLifetime in Ihrem SearchResultsView oder Ansichtsmodell wie dies gerade zu implementieren:

public class SearchResultsViewModel : BindableBase, IRegionMemberLifetime 
{ 
    // Stuff... 

    public bool KeepAlive => false; 
} 

Dies wird Prism verursachen, die Region zu zerstören Inhalt, wenn es weg navigiert wird.


Sonst könnte man INavigationAware implementieren, wenn die Suchzeichenketten zu prüfen sind unterschiedlich:

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 
    } 
} 

Dieses Prisma erzählen wird jedes Mal eine neue Instanz zu erstellen, wenn der Suchbegriff anders, sonst wird es angezeigt das bestehende.

Warnung: Dies könnte jedoch zu einem MemoryLeak führen, da Sie wahrscheinlich viele Instanzen der Ansicht erstellen werden, wenn die Suchzeichenfolge nicht übereinstimmt. Sie müssen sie daher manuell bereinigen.

+0

Danke. es sieht gut aus – kaycee

Verwandte Themen