【发布时间】:2014-02-11 16:08:36
【问题描述】:
我正在将 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 区域。我可以看到该区域中显示的其他项目,并且它们都按预期设置了 DataContexts。
然而,对于我的警报模块,ContentPresenter 没有继承的 DataContext,它被标记为 Local,这与该区域中的所有其他项目不同。当我尝试查看最底部 ContentPresenter 的 DataContext 时,我被告知“对象为 NULL”。
不过,所有这些都不是重点,因为我的视图正在加载到树中,但我的 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>
【问题讨论】:
-
"使用 Snoop 的附加信息,我可以深入到 StatusBar 区域。我可以看到该区域中显示的其他项目,并且它们的 DataContexts 都按预期设置。"您是否在该区域注册了超过 1 个视图?如果是这样,在您进行导航之前,只有注册的第一个视图是可见的。如果没有,发布您创建区域的位置的 XAML 会有所帮助。
-
@TTat 我已经用区域标记更新了帖子的底部。此状态栏区域显示 5 个不同的视图,所有视图并排显示在应用程序窗口的底部。
-
只是澄清一下。你在做这样的事情? this.regionManager.RegisterViewWithRegion(RegionNames.statusBarRegion, () => new StatusView1()); this.regionManager.RegisterViewWithRegion(RegionNames.statusBarRegion, () => new StatusView2()); ... this.regionManager.RegisterViewWithRegion(RegionNames.statusBarRegion, () => new StatusBarAlarmsView());
-
StatusBarRegion 中显示的每个模块在初始化期间都会向 RegionManager 注册它们的视图,因此代码不会同时运行,但是是的,它实际上与此类似。
-
对不起,如果这是一个愚蠢的问题,但我需要问:你是在 StatusBarAlarmsView 的构造函数中调用 InitializeComponent 方法吗?