我正在将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>
答案 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));