2012-10-16 92 views
0

假設我使用MVVM方法(Silverlight)MVVM和Silverlight中的導航

我使用命令處理了所有按鈕。

假設我有一個按鈕用於導航到某個頁面,例如我們選擇了一個網格中的客戶,並且想導航到客戶的詳細信息視圖。

我可以使用DelegateCommand處理此按鈕嗎?怎麼樣?我可以從ViewModel處理導航嗎?我是否被迫從代碼隱藏處理導航?

+0

你如何從一個頁面導航到當前頁面?你有某種導航服務嗎?如果你會提供一些非常有用的代碼。 –

+0

現在我正在使用代碼隱藏方法: private void btnCustomer_Click(object sender,RoutedEventArgs e){{0} {0} {0} {{}} NavigationService.Navigate(new Uri(「/ CustomerDetails」,UriKind.Relative)); }' – Rafael

+0

未解決的問題:導航是否真的是ViewModel的一部分,還是View的實現細節?如果是後者,可以根據需要堅持使用代碼隱藏或HyperlinkBut​​ton。 – jv42

回答

0

這裏,我們去:

的XAML:

<Button Command="{Binding GoToCustomerDetailsPage}" Content="Customer Details"/> 

視圖模型:

private INavigationService _navigationService; 

public ViewModel(INavigationService navigationService) 
{ 
    _navigationService=navigationService; 
} 
public ICommand GoToCustomerDetailsPage 
{ 
    get{ 
     return new DelegateCommand(GoToCustDetailsPage,CanGoToCustDetailsPage); 
     } 
} 

private void GoToCustDetailsPage() 
{ 
    _navigationService.Navigate(new Uri("/CustomerDetails", UriKind.Relative)); 
} 

private bool CanGoToCustDetailspage() 
{ 
    return true;//Or some sensible code that determines if this is sensible. 
} 

基本上,該命令被綁定到按鈕按正常。該命令是viewmodel上的一個屬性。當命令執行時,它只是在視圖模型中調用一個私有方法。

+0

在INavigationService位於哪個dll中,我在頁面中使用NavigationService,並且Page有一個navigationService聲明,但是如何在ViewModel中執行? – Rafael

+0

我想我已經用你的建議部分解決了它。我在ViewModel構造函數中使用了NavigationService而不是INavigationService,並且將usings語句設置爲System.Windows.Navigation,但是當單擊導航按鈕時,此版本的構造函數未被使用,因此,我的navigationService變量爲null! – Rafael

+0

當你實例化你的視圖模型時,你如何傳遞你的導航服務?例如:新的ViewModel(NavigationService),其中NavigationService是導航服務對象的一個​​實例。 –

0

這裏INavigationService不可用。它提供了錯誤,如果我們添加的命名空間System.Windows.Navigation ..