Skip to content

Instantly share code, notes, and snippets.

public class RegionManager : IRegionManager
{
public static readonly DependencyProperty RegionNameProperty = DependencyProperty.RegisterAttached(
"RegionName",
typeof(string),
typeof(RegionManager),
new PropertyMetadata(OnSetRegionNameCallback));
public static void SetRegionName(DependencyObject regionTarget, string regionName)
{
public void RegisterViewWithRegion(string regionName, Type viewType)
{
this.RegisterViewWithRegion(regionName, () => this.CreateInstance(viewType));
}
--ViewA.xaml
<ContentControl regions:RegionManager.RegionName="RegionA"></ContentControl>
--ViewB.xaml
<ItemsControl regions:RegionManager.RegionName="RegionB"></ItemsControl>
--ViewC.xaml
<ContentControl regions:RegionManager.RegionName="RegionC"></ContentControl>
--ViewA.xaml
<ItemsControl regions:RegionManager.RegionName="RegionA"></ContentControl>
--ViewB.xaml
<ItemsControl regions:RegionManager.RegionName="RegionB"></ItemsControl>
--ViewC.xaml
<ContentControl regions:RegionManager.RegionName="RegionC"></ContentControl>
--ViewA.xaml
<ItemsControl regions:RegionManager.RegionName="RegionA"></ContentControl>
--ViewB.xaml
<ContentControl regions:RegionManager.RegionName="RegionB"></ItemsControl>
--ViewC.xaml
<ContentControl regions:RegionManager.RegionName="RegionC"></ContentControl>
--ViewA.xaml
<ItemsControl regions:RegionManager.RegionName="RegionA"></ContentControl>
--ViewB.xaml
<ContentControl regions:RegionManager.RegionName="RegionB"></ItemsControl>
public IRegionManager AddToRegion(string regionName, object view)
{
if (!Regions.ContainsRegionWithName(regionName))
throw new ArgumentException(string.Format(Thread.CurrentThread.CurrentCulture, Resources.RegionNotFound, regionName), nameof(regionName));
return Regions[regionName].Add(view);
}
// Uncomment the following three lines and we get exception, this gets fixed with scoped region
var region = regionManager.Regions["ViewA"];
region.Add(unityContainer.Resolve<ViewA>());
region.Add(unityContainer.Resolve<ViewA>());
// the following works
// regionManager.AddToRegion("ViewA", unityContainer.Resolve<ViewA>());
// regionManager.AddToRegion("ViewA", unityContainer.Resolve<ViewA>());
// creating duplicate regions via region.add correctly throws exception
var region = regionManager.Regions["ViewA"];
region.Add(unityContainer.Resolve<ViewA>());
region.Add(unityContainer.Resolve<ViewA>());
// creating duplicate regions via regionManager.AddToRegion does not throw exception
regionManager.AddToRegion("ViewA", unityContainer.Resolve<ViewA>());
regionManager.AddToRegion("ViewA", unityContainer.Resolve<ViewA>());
public IRegion Initialize(T regionTarget, string regionName)
{
if (regionName == null)
throw new ArgumentNullException(nameof(regionName));
IRegion region = this.CreateRegion();
region.Name = regionName;
SetObservableRegionOnHostingControl(region, regionTarget);