在C#模块中向RegionManager添加视图不起作用

时间:2014-01-21 20:43:59

标签: .net wpf mvvm prism

我正在将VB.NET PRISM模块转换为C#。这是一个非常简单的事情,目前在VB.NET中工作。它显示绑定到ViewModel的字符串值。

视图的XAML(我将其切换为硬编码文本以强制显示,通常它是数据绑定控件):

<UserControl x:Class="StatusBarAlarmsView"
                     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                     xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
                     mc:Ignorable="d" 
                     MinWidth="150">
    <Grid>
        <TextBlock Text="Garrison" VerticalAlignment="Center"/>
    </Grid>
</UserControl>

以下代码在VB中用于显示视图:

regionManager.RegisterViewWithRegion(RegionNames.statusBarRegion, 
    Function() container.Resolve(Of iSBAlarmsPresenter).view)

我尝试使用转换后的C#代码做同样的事情,它看起来像这样:

this.regionManager.RegisterViewWithRegion(RegionNames.statusBarRegion,
    () => new StatusBarAlarmsView());

我尝试了上述C#的多种排列,但都没有成功:

// One
var statusbarRegion = regionManager.Regions[RegionNames.statusBarRegion];
var test = new StatusBarAlarmsView();
test.ViewModel = new AlarmViewModel(this.logger, this.eventAggregator, null, 
    this.container);
statusbarRegion.Add(test);

// Two
this.regionManager.RegisterViewWithRegion(RegionNames.statusBarRegion,
    () => container.Resolve<iSBAlarmsPresenter>().View);

我不会详细介绍View和ViewModel如何挂钩,因为目前我并不关心 - 我只是想让它显示“Garrison”。

其他信息 使用Snoop,我可以深入了解StatusBar Region。我可以看到该区域中显示的其他项目,并且它们都按预期设置了DataContexts。

但是,使用我的警报模块,ContentPresenter没有继承的DataContext,它被标记为Local,这与该区域中的所有其他项目不同。当我尝试查看最底层的ContentPresenter的DataContext时,我被告知“对象是NULL”。

然而,所有这一切都不重要,因为我的View被加载到树中,但我的TextBlock没有显示。

更新 根据要求,StatusBar区域的XAML标记:

<Grid Name="StatusBarGrid" Grid.Row="3" Height="30">
    <e:Interaction.Behaviors>
        <behaviors:GridHeightModifyOnFontChangeBehavior FontSize="{DynamicResource AppFontSize}"/>
    </e:Interaction.Behaviors>
    <DockPanel >
        <WrapPanel  DockPanel.Dock="Right"  cal:RegionManager.RegionName="{x:Static inf:RegionNames.statusBarRightRegion}" Orientation="Horizontal" Background="{DynamicResource ControlBackgroundBrush}"   />
        <StatusBar DockPanel.Dock="Left"  cal:RegionManager.RegionName="{x:Static inf:RegionNames.statusBarRegion}" />
    </DockPanel>
</Grid>

2 个答案:

答案 0 :(得分:2)

您是否在StatusBarAlarmsView的构造函数中调用InitializeComponent方法?

添加视图时的常见错误(特别是如果需要修改这些视图的构造函数)是忘记调用InitializeComponent方法。此方法“告诉”视图以创建和呈现其内部组件。如果没有调用它,你通常会发现你的视图看起来是空的,因为它的组件从未创建过。

答案 1 :(得分:0)

我认为您试图在状态区域同时显示所有5个状态视图?那是不可能的。在区域中注册的第一个视图将是可见且活动的。您注册的其他人在您导航到它之前不会显示。

尝试在加载所有内容后执行此操作以查看StatusBarAlarmsView是否显示。

this.regionManager.RequestNavigate(RegionNames.statusBarRegion, new Uri("StatusBarAlarmsView", UriKind.Relative));

还让容器为您创建视图,以便它可以处理视图模型和所有依赖项:

this.regionManager.RegisterViewWithRegion(RegionNames.statusBarRegion, typeof(StatusBarAlarmsView));