2014-01-21 50 views
2

我正在將VB.NET PRISM模塊轉換爲C#。這是一個非常簡單的事情,目前在VB.NET中起作用。它顯示綁定到ViewModel的字符串值。將視圖添加到C#模塊中的RegionManager不起作用

的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); 

我不會去的查看和視圖模型如何掛鉤的細節,因爲現在我不關心that--我只是想讓它顯示「駐軍」。

附加信息 使用Snoop,我可以深入到StatusBar區域。我可以看到該區域中顯示的其他項目,並且它們都按預期設置了其DataContexts。

但是,使用我的警報模塊時,ContentPresenter沒有繼承的DataContext,它被標記爲Local,它與該區域中的所有其他項目不同。當我嘗試查看最底層的ContentPresenter的DataContext時,我被告知「對象爲NULL」。

儘管如此,我的視圖被加載到樹中,但是我的TextBlock卻沒有顯示,所有這些都在旁邊。

更新 按照要求,在狀態欄地區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

「附加信息使用Snoop,我可以深入到狀態欄區域,我可以看到該區域中顯示的其他項目,並且它們都按預期設置了其DataContexts。」 您是否在該區域註冊了多個視圖?如果是這樣,只有第一個已註冊的視圖纔會顯示,直到您進行導航。如果沒有,發佈XAML來創建區域會有所幫助。 – TTat

+0

@TTat我用Region標記更新了帖子的底部。此StatusBar區域顯示5個不同的視圖,並排顯示在應用程序窗口的底部。 –

+0

只是澄清。你在做這樣的事情嗎? this.regionManager.RegisterViewWithRegion(RegionNames.statusBarRegion, ()=> new StatusView1()); this.regionManager.RegisterViewWithRegion(RegionNames.statusBarRegion, ()=> new StatusView2()); ... this.regionManager.RegisterViewWithRegion(RegionNames.statusBarRegion, ()=> new StatusBarAlarmsView()); – TTat

回答

2

你調用在StatusBarAlarmsView的構造函數的InitializeComponent方法?

當添加視圖時(特別是如果您需要修改這些視圖的構造函數)時,常見的錯誤是忘記調用InitializeComponent方法。這個方法「告訴」視圖來創建和渲染其內部組件。如果它沒有被調用,你通常會發現你的視圖看起來是空的,因爲它的組件從未被創建過。

+0

必須等待一小時才能兌現獎勵 - 將盡快完成。再次感謝! –

+1

不客氣。我記得之前曾經有過幾次同樣的問題,這很令人沮喪。我很高興能夠提供幫助。 –

0

我想你想展示你的狀態區在同一時間全部5周狀態的看法?這是不可能的。在該區域中註冊的第一個視圖將可見且處於活動狀態。您註冊的其他人在導航到它之前不會顯示出來。

嘗試在加載所有內容後查看您的StatusBarAlarmsView是否顯示。

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

也讓容器創建你的意見對你那麼它可以處理視圖模型和所有的依賴:

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

每個視圖顯示了不同的東西,並且是它自己的視圖/虛擬機和模塊。他們目前都在StatusBar控件中一起工作並一起顯示。此模塊/代碼在VB中工作,並按預期顯示。在C#中使用相同的代碼時它不起作用。 –

+0

是的,但每個區域一次只能顯示1個視圖。你正試圖向你的RegionNames.statusBarRegion註冊5個不同的視圖嗎?只有註冊的第一個纔可見。之後的任何內容都已註冊,但只有在「導航」到該視圖後纔會生效。 – TTat

+0

我檢查了所有的模塊調用相同的代碼:'regionManager.RegisterViewWithRegion(RegionNames.statusBarRegion, Function()container.Resolve(Of IxxxPresenter).view)''。每個模塊都有自己的Presenter接口和實現,它們都具有不同的View/VM實現。他們之間沒有任何共享。它們都在同一時間顯示。該代碼也沒有一個RequestNavigate()調用。 –

相關問題