2011-05-07 4 views
1

안녕 얘들 아,
프리젠 테이션을 구현하기 위해 프리즘 4를 사용하고 있습니다. 것은 지역을 포함하는보기를 사용하고 있습니다. 이제는 같은보기 아래 다른보기로 이동하려고합니다. 범위 그래서보기에서 KeepAlive 속성을 false로 설정하여 탐색에서보기가 영역에서 제거되고 새보기가 나타나지만 지역 이름이 이미 예외로 유지되도록합니다. 당신은 탐색 범위가 지정된 RegionManager를 사용하려면처럼이 지역을 포함 동일한 뷰의 몇 가지 인스턴스를 탐색 할 수있는 방법
그것은 소리
, 둘다조회 탐색 프리즘

+0

같은 문제가 있습니다. 네비게이션의 예에서 이것이 나타나지 않는 것으로 보입니다. –

답변

0


감사합니다 (단 하나의 시간에 메모리에 있어야합니다). 같은 RegionManager에 같은 이름의 region이 두 개 이상 있기 때문에 지역 이름이 표시되는 이유는 이미 존재합니다.

기본적으로 PRISM은 탐색 기능이있는 범위가 지정된 RegionManager를 지원하지 않지만 사용자 정의 RegionBehaviors를 사용하면이 기능을 추가하기가 쉽습니다. 기본적으로 인터페이스를 만든 다음보기 또는보기 모델에서 해당 인터페이스를 구현해야합니다. 그런 다음 해당 인터페이스를 찾는 RegionBehavior를 만들고 요구 사항을 충족하는 경우 해당보기에 대한 새 RegionManager 인스턴스를 만듭니다.

여기에 인터페이스가 같이 할 수있는 작업은 다음과 같습니다

public interface IRegionScopeAware 
{ 
    bool IsRegionManagerScoped { get; } 
} 

그리고 여기 RegionBehavior의 모습은 다음과 같습니다

public class RegionScopeAwareBehavior : RegionBehavior 
{ 
    #region Overrides of RegionBehavior 

    protected override void OnAttach() 
    { 
     Region.Views.CollectionChanged += ViewsOnCollectionChanged; 
     ApplyScopedRegionManager(Region.Views.OfType<FrameworkElement>()); 
    } 

    #endregion 

    private static void ViewsOnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
    { 
     if (e.NewItems == null || e.Action != NotifyCollectionChangedAction.Add) return; 
     ApplyScopedRegionManager(e.NewItems.OfType<DependencyObject>()); 
    } 

    private static void ApplyScopedRegionManager(IEnumerable<DependencyObject> views) 
    { 
     if (views == null) return; 
     foreach (var view in views) 
     { 
      ApplyScopedRegionManager(view); 
     } 
    } 

    private static void ApplyScopedRegionManager(DependencyObject view) 
    { 
     if (view == null) return; 
     IRegionScopeAware scopeAware = view as IRegionScopeAware; 
     if (scopeAware == null && view is FrameworkElement) 
      scopeAware = ((FrameworkElement) view).DataContext as IRegionScopeAware; 
     if (scopeAware != null) 
      ApplyScopedRegionManager(scopeAware, view); 
    } 

    private static void ApplyScopedRegionManager(IRegionScopeAware scopeAware, DependencyObject view) 
    { 
     if (view == null) return; 
     if (scopeAware == null) return; 
     if (scopeAware.IsRegionManagerScoped) 
      RegionManager.SetRegionManager(view, new RegionManager()); 
    } 
} 

그리고 당신은 당신의 RegionBehavior를 등록해야한다는 점 잊지 마세요. 부트 스트 래퍼에 기본 RegionBehavior로 등록하는 것이 좋습니다.

 protected override IRegionBehaviorFactory ConfigureDefaultRegionBehaviors() 
     { 
      IRegionBehaviorFactory factory = base.ConfigureDefaultRegionBehaviors(); 
      factory.AddIfMissing(typeof(RegionScopeAwareBehavior).Name, typeof(RegionScopeAwareBehavior)); 
      return factory; 
     }