我正在开发一项功能,允许用户选择一些数据源。每个数据源可以具有不同的条件。例如,假设数据源描述的是家居用品,如果用户选择面包,我会给他们一个组合框来选择品牌,另一个给他们来选择类型,即白色,全谷物等,如果他们选择油漆,我会有组合选择颜色和数量的框。换句话说,每种数据源类型都有专用的视图和视图模型。就我而言,有10种不同类型的数据源,我已经为每种类型的数据源和一个对应的视图创建了视图模型。
在我的示例中,我有一个包含多个行的DataGrid。每行都有一个专用于数据源的单元格和一个组合框,允许用户更改数据源。更改数据源后,将创建与所选数据源类型相对应的新视图模型。我正在使用Unity容器创建视图的实例,然后设置数据上下文。数据源在数据网格中定义。数据网格的每一行都是一个视图模型IRowViewModel,其中包含一个名为PrimaryRegionName的属性。我为要用作区域名称的每一行生成一个随机的16个字符串。我将RegionManager.RegionName绑定到我的属性。 (见下文)
xaml
<DataGridTemplateColumn Header="Primary" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ContentControl Grid.Row="1"
prism:RegionManager.RegionName="{Binding PrimaryRegionName}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
我创建我的视图并使用下面的代码将其注册到该区域
> register the view with the container as a type. This is the active instance for a view model for the region
> "region" here is the region name e.g "000011112222ffff"
container.RegisterType(viewType, region);
> Resolve an instance of the view
view = _container.Resolve(viewType, region);
_regionManager.RegisterViewWithRegion(region, view.GetType());
_regionManager.Regions[region].Add(view);
(view as System.Windows.FrameworkElement).DataContext = viewModel;
我猜测的是,在创建视图时,由于稍后设置了数据上下文,因此对于每个新行,都不会向区域管理器注册任何区域。我想知道的是,如何使用运行时定义的名称创建区域?
答案 0 :(得分:0)
发布此信息后,我意识到我要做的就是创建一个新的Region,设置名称并将其添加到我的Region Manager中
_container.RegisterType(viewType, region);
view = _container.Resolve(viewType, region);
(view as System.Windows.FrameworkElement).DataContext = viewModel;
IRegion r = new Region();
r.Name = region;
_regionManager.Regions.Add(r);
_regionManager.RegisterViewWithRegion(region, view.GetType());
_regionManager.Regions[region].Add(view);