2012-04-12 18 views
0

嗯,我現在一直在撓頭。但未能找到解決我的問題。我所擁有的是帶有和ObservableCollection TabItems的MainViewModel。對於MainView(用戶控件),MainViewModel被設置爲DataContext,而後者又託管TabControl。 tabcontrol被綁定到TabItems集合。 tabcontrol的內容將是ReportItems用戶控件。從tab中添加製表符到製表符

此設置基本上是爲SSRS報告用戶界面報告。第一個選項卡包含一個報告列表,用於顯示用戶選擇報告參數的幾個列表框。不是在選擇參數後,用戶單擊一個按鈕,該按鈕又會生成一個報告,並使用報告主機將選項卡添加到選項卡控件。

我試圖從選項卡而不是主視圖中選擇報表的原因是有很多參數需要選擇,如果我將列表框添加到MainView中,留給tabcontrol的空間是較少,用戶需要向下滾動查看報告。

我不確定我的設計是否有缺陷,但我想找出添加新的ReportItemViewModel以添加到TabItem集合的方法。這意味着允許一個子選項卡通過發送一個ReportItemViewModel對象到MainViewModel並添加到集合中來添加同級。

我想使用一個靜態集合來這樣做,但不會調用我的OnPropertyChange方法。另外,在MainViewModel中使用靜態方法並不能解決問題,因爲它不能將對象添加到集合中,因爲集合不是靜態的。

我不在這裏發佈任何代碼,因爲我被困在如何開始自己。我看了另一篇文章here,但無法弄清楚如何使用它。

對不起,很長的描述,只是想明確的問題。

我接受任何建議,如果我可以得到更好的設計。我絕望,任何幫助將不勝感激。

+0

您可以使用彈出窗口或擴展器來託管添加過程的UI。這種方式你不使用屏幕房地產,你不寫在你的ReportItemViewModel添加邏輯。 – AlexDrenea 2012-04-12 13:30:23

+0

Popup是我曾想過的東西,但我覺得好像它看起來不合適。關於擴展器,不知道如何實現它,因爲我有多個報告。你的意思是說,對於每個報告,我有一個處於禁用/不可見模式的擴展器,並應根據報告選擇啓用/可見。你能詳細說明嗎? – 2012-04-12 13:46:11

+0

你說你有一個標籤列表,而不是主視圖,因爲你想保留屏幕的房地產。我在說,在主視圖中使用擴展器可以在摺疊時爲報表提供足夠的空間,然後在展開時有足夠空間添加新報表。 – AlexDrenea 2012-04-12 13:53:15

回答

3

添加ICommandMainViewModel添加一個新的項目到您的ObservableCollection,並使用RelativeSource結合從TabItem

內找到命令所以你MainViewModel將有

ObservableCollection<IViewModel> TabItems 
IViewModel SelectedTabItem 
ICommand AddTabCommand 

其中AddTabCommand基本上沒有

void AddTab(IViewModel newItem) 
{ 
    TabItems.Add(newItem); 
    SelectedTabItem = newItem; 
} 

和你的UI看起來會沿着這個

<DataTemplate DataType="{x:Type local:SelectReportViewModel}"> 
    <Grid> 
     ... 
     <!-- Use the CommandParameter property to pass specified ReportItemViewModel to open --> 
     <Button Command="{Binding DataContext.AddTabCommand, 
       RelativeSource={RelativeSource AncestorType={x:Type TabControl}}}" /> 
     ... 
    </Grid> 
</DataTemplate> 

<TabControl ItemsSource="{Binding TabItems}" /> 

線條另一種方法是使用某種類型的事件系統,如MVVM光的Messenger或Microsoft棱鏡的EventAggregator,廣播/訂閱事件。

您的MainViewModel將訂閱AddTabEvents,而您的SelectReportViewModel將在任何時候播放這些活動,以便添加新選項卡。如果您有興趣,我的博客文章中有關於communication between ViewModels的簡短摘要。

+0

這看起來很有前途。實際上我正在尋找這樣的東西,但從來沒有聽說過,因爲我對WPF來說比較陌生。從來沒有想過如何從一個VM到另一個VM進行通信。將執行並讓你知道它是如何進行的。 – 2012-04-12 14:42:14

+0

太棒了...它的工作原理...我使用了Event Aggregator模式...像魅力一樣工作......非常感謝...... :) – 2012-04-14 10:46:53