2013-12-10 52 views
0

我有一個左,右停靠面板的WPF窗體。左側面板具有一些用戶輸入,基於這些輸入,我可以在右側的停靠面板內創建並啓動不同的用戶控件。我們正在使用MMVM框架。目前,我們正在從表單的視圖模型創建和啓動用戶控件。我不確定這是否正確,因爲它似乎違反VM的MVVM規則不應訪問View。那是對的嗎?有沒有其他的設計可以使用(我想我也不能在代碼背後寫任何東西,對嗎?)。WPF窗體和用戶控件

回答

1

不,你不應該在ViewModel中有任何View特定的代碼。你可以有代碼隱藏,如果它純粹是UI(沒有業務邏輯)相關。

MVVM WPF Apps With The Model-View-ViewModel Design Pattern上有一篇關於MSDN的文章。我建議,在使用MVVM模式編寫任何WPF應用程序之前,請閱讀本文。

針對您的特殊情況下,我會在右側面板ContentControl,並有獨立的ViewModel s到備份不同UserControl秒,然後有DataTemplates定義,以顯示正確的UserControl對於任何給定ViewModel秒。

未經測試的僞代碼:

的DataTemplates

<DataTemplate DataType="{x:Type local:ViewModel1}"> 
    <local:UserControl1 /> 
</DataTemplate> 

<DataTemplate DataType="{x:Type local:ViewModel2}"> 
    <local:UserControl2 /> 
</DataTemplate> 

你會在Window.Resources部分或在ResourceDictionary定義這些,包括那本字典在Window.Resources

ContentControl中

<ContentControl Content="{Binding CurrentContent}" /> 

在支持MainWindow的當前ViewModel中,您將擁有一個名爲CurrentContent的屬性,當您將其設置爲正確的ViewModel實例時,屏幕上將顯示相應的關聯View/UserControl

UPDATE

您將有TabControl,而不是ContentControl,並有ObservableCollection屬性(假設它被命名爲ContentItems)在您的視圖模型,而不是CurrentContent。 TabControl會在您向ObservableCollection中添加/刪除項目時添加/刪除TabItems

<TabControl ItemsSrouce="{Binding ContentItems}" /> 

我從我的一個項目粘貼示例TabControl代碼。

<TabControl ItemsSource="{Binding Tabs}" 
      SelectedItem="{Binding SelectedTab}" 
      Margin="5" 
      Visibility="{Binding HasTabs, Converter={StaticResource VisibilityConverter}}"> 
     <TabControl.ItemTemplate> 
      <DataTemplate> 
        <TextBlock Text="{Binding Header}" 
           Grid.Column="0" 
           TextTrimming="CharacterEllipsis" 
           ToolTip="{Binding Header}" 
           FontWeight="Bold" 
           TextAlignment="Center" HorizontalAlignment="Center" VerticalAlignment="Center"/> 
       </Grid> 
      </DataTemplate> 
     </TabControl.ItemTemplate> 
    </TabControl> 

希望是有道理的

+0

謝謝你的回覆。它變得更有意義,看起來更乾淨。 如果我想要同時加載多個用戶控件(可能在不同的選項卡中,根據需要創建一個新的控件),該怎麼辦?我猜測結構會改變,但不完全確定如何。 – Padmaja

+0

不確定,如果我正確理解你的評論,但請檢查我的更新答案,看看是否有道理。 – sthotakura

+0

非常好。謝謝。 – Padmaja