2017-01-26 13 views
0

Код ниже работал над общим экземпляром представления. Теперь то, что я пытаюсь достичь, каждый раз, когда я перехожу к ViewB Я хочу новый экземпляр представления и его модель просмотра. Я пробовал различные комбинации ниже, но все они, кажется, в конечном счете заканчиваются RequestNavigate неисправного молча во второй раз, когда я пытаюсь перейти к ViewB ...MEF, Призма и новый экземпляр представления при навигации

Я также попытался установить IsNaviagtionTarget ложь после того, как был навигация один раз.

Загрузчик:

public void Initialize() 
{ 
    _regionManager.RegisterViewWithRegion(RegionNameConstants.MainRegion, typeof(ViewA)); 
    _regionManager.RegisterViewWithRegion(RegionNameConstants.MainRegion, typeof(ViewB)); 
} 

ViewB (класс):

[RegionMemberLifetime(KeepAlive = false)] 
[Export] 
[PartCreationPolicy(CreationPolicy.NonShared)] 
internal partial class ViewB 
{ 
    [ImportingConstructor] 
    public ViewB(ViewBViewModel viewModel) 
    { 
     InitializeComponent(); 
     DataContext = viewModel; 
    } 
} 

ViewBViewModel:

[Export(typeof(ViewBViewModel))] 
[PartCreationPolicy(CreationPolicy.NonShared)] 
internal class ViewBViewModel : BindableBase, INavigationAware 
{ 
    public void OnNavigatedTo(NavigationContext navigationContext) 
    { 
    } 

    public bool IsNavigationTarget(NavigationContext navigationContext) 
    { 
     return true; 
    } 

    public void OnNavigatedFrom(NavigationContext navigationContext) 
    { 
    } 
} 

ViewA просто имеет кнопку с командой, которая вызывает:

ViewA Навигация Команда:

public override void Execute(object parameter) 
{ 
    _regionManager.RequestNavigate(RegionNameConstants.MainRegion, new Uri(nameof(ViewB), UriKind.Relative)); 
} 

ответ

1

Не регистрируйте typeof(ViewB) с менеджером региона в загрузчике:

public void Initialize() 
{ 
    _regionManager.RegisterViewWithRegion(RegionNameConstants.MainRegion, typeof(ViewA)); 
} 

И так как вы переходите на Uri nameof(ViewB), вы также должны экспортировать представление с указанием названия контракта nameof(ViewB):

[Export(nameof(ViewB))] 
[PartCreationPolicy(CreationPolicy.NonShared)] 
[RegionMemberLifetime(KeepAlive = false)] 
internal partial class ViewB 
{ 
    [ImportingConstructor] 
    public ViewB(ViewBViewModel viewModel) 
    { 
     InitializeComponent(); 
     DataContext = viewModel; 
    } 
} 

Тогда вы должны получить новый экземпляр ViewB каждый раз, когда вы перейти к ней с помощью:

_regionManager.RequestNavigate(RegionNameConstants.MainRegion, new Uri(nameof(ViewB), UriKind.Relative)); 
+0

Магия была в nameof (ViewB), который работал без дополнительного регистра я использовал в своем ответе , Хороший звонок. – JonWells