나는 당신과 같은 상황 이었지만 중첩 된 영역 관리자가 있었지만 모든 자식보기는 여전히 전역 영역 관리자를 얻고있었습니다. 나는 합리적인 해결책이라고 생각하는 것을 생각해 냈습니다.
/// <summary>
/// An interface which is aware of the current region manager.
/// </summary>
public interface IRegionManagerAware
{
/// <summary>
/// Gets or sets the current region manager.
/// </summary>
/// <value>
/// The current region manager.
/// </value>
IRegionManager RegionManager { get; set; }
}
그럼 설정 때문에 같은 RegionBehavior
: 다음
protected override IRegionBehaviorFactory ConfigureDefaultRegionBehaviors()
{
var behaviours = base.ConfigureDefaultRegionBehaviors();
behaviours.AddIfMissing(RegionAwareBehaviour.RegionAwareBehaviourKey, typeof(RegionAwareBehaviour));
return behaviours;
}
:
/// <summary>
/// A behaviour class which attaches the current scoped <see cref="IRegionManager"/> to views and their data contexts.
/// </summary>
public class RegionAwareBehaviour : RegionBehavior
{
/// <summary>
/// The key to identify this behaviour.
/// </summary>
public const string RegionAwareBehaviourKey = "RegionAwareBehaviour";
/// <summary>
/// Override this method to perform the logic after the behaviour has been attached.
/// </summary>
protected override void OnAttach()
{
Region.Views.CollectionChanged += RegionViewsChanged;
}
private void RegionViewsChanged(object sender, NotifyCollectionChangedEventArgs e)
{
Contract.Requires<ArgumentNullException>(e != null);
if (e.NewItems != null)
foreach (var item in e.NewItems)
MakeViewAware(item);
}
private void MakeViewAware(object view)
{
Contract.Requires<ArgumentNullException>(view != null);
var frameworkElement = view as FrameworkElement;
if (frameworkElement != null)
MakeDataContextAware(frameworkElement);
MakeAware(view);
}
private void MakeDataContextAware(FrameworkElement frameworkElement)
{
Contract.Requires<ArgumentNullException>(frameworkElement != null);
if (frameworkElement.DataContext != null)
MakeAware(frameworkElement.DataContext);
}
private void MakeAware(object target)
{
Contract.Requires<ArgumentNullException>(target != null);
var scope = target as IRegionManagerAware;
if (scope != null)
scope.RegionManager = Region.RegionManager;
}
}
이 그런 다음 부트 스트 래퍼의 모든 지역이 적용
먼저 나는 인터페이스를 정의 아마도 다음과 같이 view/viewmodel에 IRegionManagerAware
을 구현하면됩니다. 이보기는 지역에 추가 될 때
public class MyView : IRegionManagerAware
{
IRegionManager RegionManager { set; get; }
}
그런 행동은 올바르게 현재 범위의 지역 매니저로 RegionManager
속성을 설정합니다.
아주 좋습니다. 나는 여전히 PRISM을 사용하고 있지만 거의 완전히 재 작성되었습니다. 프리즘은 훌륭한 확장 가능한 아키텍처를 가지고 있습니다. –
훌륭한 작품입니다. 계약 만 사용 중지했습니다. – lvmeijer