如何在运行时创建新区域

时间:2019-04-09 23:05:28

标签: c# wpf prism

我正在开发一项功能,允许用户选择一些数据源。每个数据源可以具有不同的条件。例如,假设数据源描述的是家居用品,如果用户选择面包,我会给他们一个组合框来选择品牌,另一个给他们来选择类型,即白色,全谷物等,如果他们选择油漆,我会有组合选择颜色和数量的框。换句话说,每种数据源类型都有专用的视图和视图模型。就我而言,有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;

我猜测的是,在创建视图时,由于稍后设置了数据上下文,因此对于每个新行,都不会向区域管理器注册任何区域。我想知道的是,如何使用运行时定义的名称创建区域?

1 个答案:

答案 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);
相关问题