2012-05-30 48 views
0

我即將開始我的第一個Silverlight項目(Silverlight 4.0),並花費了一些時間研究最佳方法等。我將使用MVVM並花費了前幾天的導航。如何在帶導航服務的Silverlight中實現MVVM?

首先,我注意到許多MVVM示例並未將MainPage作爲視圖/視圖模型實現。 MainPage包含導航框架和Uri映射,然後導航到遵循視圖/視圖模型的頁面。使用MVVM和主頁面沒有作爲View/View Model實現的導航服務是否是標準的?例如,Silverlight 4培訓套件包含事件管理器示例,主頁面中有很多代碼,即處理導航事件(如導航和導航失敗)。但所有其他頁面都是查看/查看模型。其次,通過導航服務,改變導航的邏輯現在由View實現,而不是由View Model控制(這違背了MVVM背後的一些想法)。網上的一些方法使用從ViewModel到視圖的消息傳遞,或將導航服務傳遞給ViewModel以及在那裏控制的導航。這兩種方法中哪一種都比另一種更好?

理想情況下,我想找到一個示例,其中主頁遵循View/ViewModel和ViewModel控制導航,並且視圖從後面的代碼中解放出來。我問的太多了嗎?

僅供參考我不使用PRISM或MVVM Light。

乾杯

回答

0

在我的項目,我們已經創建了一個容器內和的MainPage每個視圖被加載在那裏。 這樣我們不需要在代碼隱藏中放置任何代碼。 當主頁面作爲App上的RootVisual啓動時,MainPage會以DataContext的形式接收我們創建shell的類。容器從這個類中接收一個DP,我們使用shell中的事件來加載視圖。

這裏是容器的代碼:

<ContentControl Name="region1ContentControl" Content="{Binding Path=MainContent}" Style="{StaticResource ContentControlStyle}" Grid.Row="1" Margin="0,30" /> 

的搜索Maincontent屬性:

public static readonly DependencyProperty MainContentProperty = 
     DependencyProperty.Register("MainContent", typeof(System.Windows.Controls.Control), 
     typeof(MainPagePresenter), null); 
    public System.Windows.Controls.Control MainContent 
    { 
     get { return (System.Windows.Controls.Control)GetValue(MainContentProperty); } 
     set { SetValue(MainContentProperty, value); } 
    } 

殼+其中視圖被加載

var presenter = (Bxf.IPresenter)Bxf.Shell.Instance; 

     presenter.OnShowView += (view, region) => 
     { 
      if (region.Equals("MainContent", StringComparison.InvariantCultureIgnoreCase)) 
       MainContent = view.ViewInstance; 
      else if (region.Equals("DetailContent", StringComparison.InvariantCultureIgnoreCase)) 
       DetailContent = view.ViewInstance; 
      else 
       throw new ArgumentException(string.Format(AppStrings.InvalidRegionName, region)); 
     }; 

的MainPage代碼隱藏:

public partial class MainPage : UserControl 
{ 
    public MainPage() 
    { 
     InitializeComponent(); 
    } 
} 

你看到了嗎? 注意:我沒有使用Prism,也沒有使用MVVM光源。

+0

嗨Vinicius,謝謝你的回覆。我有點困惑 - 你的MainPage有一個相應的ViewModel嗎?我也失去了如何控制導航。如果用戶在瀏覽器中點擊向前/向後,ViewModel中是否執行了任何操作? – rockshire

+0

我們的導航每次僅限一個視圖。一旦你加載一個視圖,另一個視圖關閉。我們的MainPage有一個相應的ViewModel(我們已經創建了一個shell),它作爲MainPage的DataContext傳遞。在那裏你可以做任何你想做的事情。 – Vinicius