Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 在C#模块中将视图添加到RegionManager不起作用_.net_Wpf_Mvvm_Prism - Fatal编程技术网

.net 在C#模块中将视图添加到RegionManager不起作用

.net 在C#模块中将视图添加到RegionManager不起作用,.net,wpf,mvvm,prism,.net,Wpf,Mvvm,Prism,我正在将VB.NET PRISM模块转换为C#。这是一个非常简单的事情,目前在VB.NET中工作。它显示绑定到ViewModel的字符串值 视图的XAML(我将其切换为硬编码文本以强制显示,通常它是一个数据绑定控件): 我用转换后的C#代码做了同样的尝试,结果如下: this.regionManager.RegisterViewWithRegion(RegionNames.statusBarRegion, () => new StatusBarAlarmsView()); 我尝试

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

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

我用转换后的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);
//一个
var statusbarRegion=regionManager.Regions[RegionNames.statusbarRegion];
var test=新状态baralarmsview();
test.ViewModel=新的AlarmViewModel(this.logger,this.eventAggregator,null,
这是一个集装箱);
statusbarRegion.Add(测试);
//两个
this.regionManager.RegisterViewWithRegion(RegionNames.statusBarRegion,
()=>container.Resolve().View);
我不会详细介绍视图和ViewModel是如何连接的,因为目前我并不关心这一点——我只希望它显示“Garrison”

其他信息 使用Snoop,我可以深入到状态栏区域。我可以看到该区域中显示的其他项目,它们都按预期设置了DataContext

但是,对于我的报警模块,ContentPresenter没有继承的DataContext,它被标记为本地,这与区域中的所有其他项不同。当我试图查看最底层ContentPresenter的DataContext时,我被告知“objectisnull”

不过,所有这些都无关紧要,因为我的视图正在加载到树中,而我的文本块却没有显示出来

更新 根据请求,状态栏区域的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>

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

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

this.regionManager.RequestNavigate(RegionNames.statusBarRegion, new Uri("StatusBarAlarmsView", UriKind.Relative));
还可以让容器为您创建视图,以便它可以处理视图模型和所有依赖项:

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

您正在StatusBarAlarmsView的构造函数中调用InitializeComponent方法吗


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

“使用Snoop,我可以深入到状态栏区域。我可以看到该区域中显示的其他项目,它们的DataContext都按预期设置。”您是否在该区域注册了多个视图?如果是这样,则只有注册的第一个视图才可见,直到您进行导航。如果没有,发布创建区域的XAML会有所帮助。@t我已经用区域标记更新了文章的底部。此状态栏区域显示5个不同的视图,它们并排显示在应用程序窗口的底部。请澄清。你在做这样的事?this.regionManager.RegisterViewWithRegion(RegionNames.statusBarRegion,()=>new StatusView1());this.regionManager.RegisterViewWithRegion(RegionNames.statusBarRegion,()=>new StatusView2())。。。this.regionManager.RegisterViewWithRegion(RegionNames.statusBarRegion,()=>new StatusBarAlarmView());StatusBarRegion中显示的每个模块在初始化期间都会向RegionManager注册它们的视图,因此代码不会同时运行,但是是的,它实际上与此类似。如果这是一个愚蠢的问题,我很抱歉,但我需要问:您是否在StatusBarAlarmsView的构造函数中调用InitializeComponent方法?每个视图都显示不同的内容,并且都是自己的视图/虚拟机和模块。它们当前都在StatusBar控件中一起工作和显示。此模块/代码在VB中工作,并按预期显示。在C#中使用相同的代码时,它不起作用。是的,但每个区域一次只能显示一个视图。您正试图在RegionNames.statusBarRegion中注册5个不同的视图,对吗?只有注册的第一个将可见。之后的任何内容都已注册,但在您“导航”到该视图之前都不会处于活动状态。我选中了,所有模块都调用相同的代码:
regionManager.RegisterViewWithRegion(RegionNames.statusBarRegion,Function()container.Resolve(属于IxxxPresenter.view)
。每个模块都有自己的Presenter接口和实现,它们都有不同的View/VM实现。他们之间没有任何共同之处。它们都同时显示。代码也没有单个RequestNavigate()调用。如果您在应用程序中加载多个模块,并且它们都试图将视图注册到“StatusBarRegion”中,则只有注册的第一个视图才会显示,直到您导航到其他视图之一。将视图注册到区域中,就像在该区域中放置一张卡一样。每次注册另一个视图时,它都会将其放在堆栈的底部。当你“导航”时,你选择了你想看到的“卡片”,并把它放在上面。我不想自相矛盾,但事实似乎并非如此。想象一下5个砖块在地基上的位置,这就是这些视图在一个区域中的显示方式。这是工作代码,工作模块,我正试图转换成C。这不是我想开始工作的代码。我感谢你的帮助!必须等一个小时才能颁发赏金——很快就会颁发的。再次感谢!不客气。我记得h
this.regionManager.RequestNavigate(RegionNames.statusBarRegion, new Uri("StatusBarAlarmsView", UriKind.Relative));
this.regionManager.RegisterViewWithRegion(RegionNames.statusBarRegion, typeof(StatusBarAlarmsView));