Tôi đã ở trong tình trạng tương tự như bạn, tôi đã có một người quản lý khu vực lồng nhau, nhưng tất cả các lượt xem con vẫn nhận được người quản lý khu vực toàn cầu. Tôi nghĩ ra một giải pháp hợp lý.
Trước tiên tôi xác định một giao diện:
/// <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; }
}
Sau đó, tôi thiết lập một RegionBehavior
như vậy:
/// <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;
}
}
Sau đó, áp dụng điều này để tất cả các vùng trong bootstrapper của bạn:
protected override IRegionBehaviorFactory ConfigureDefaultRegionBehaviors()
{
var behaviours = base.ConfigureDefaultRegionBehaviors();
behaviours.AddIfMissing(RegionAwareBehaviour.RegionAwareBehaviourKey, typeof(RegionAwareBehaviour));
return behaviours;
}
Sau đó, tất cả những gì bạn phải làm là triển khai IRegionManagerAware
trên chế độ xem/chế độ xem của bạn, có thể như sau:
public class MyView : IRegionManagerAware
{
IRegionManager RegionManager { set; get; }
}
Sau đó, khi chế độ xem này được thêm vào khu vực, hành vi sẽ đặt chính xác thuộc tính RegionManager
cho người quản lý khu vực hiện tại.
Rất đẹp. Tôi vẫn đang sử dụng PRISM, nhưng nó gần như được viết lại hoàn toàn. Prism có kiến trúc mở rộng đẹp. –
Hoạt động tuyệt vời. Tôi chỉ vô hiệu hóa các Hợp đồng – lvmeijer