2012-12-15 32 views
1

我完全不熟悉Windows 8開發,現在我正面臨使用MVVM Light混合觸摸和鍵盤導航的問題。MVVM:在Windows 8中使用鍵盤處理列表項導航

因此,我有一個網格視圖中的視圖模型列表,並且只要選擇其中一個視圖模型,就會激活對選定視圖模型的導航。這可以通過觸摸或鼠標完全正常工作,但使用鍵盤時會變得非常混亂。事實上,當我想要顯示項目時,自然的行爲將是用箭頭導航列表並點擊回車,但是當用箭頭鍵改變項目時導航將被激活,這對於用戶來說真是令人困惑。

那麼我怎麼能這樣做,導航可以通過觸摸和鼠標選擇,並與選擇和鍵盤輸入組合選擇激活?

這是我使用的代碼。

視圖模型:

public ReleaseViewModel SelectedRelease 
{ 
    get 
    { 
     return selectedRelease; 
    } 
    set 
    { 
     if(selectRelease != value) 
     { 
      selectedRelease = value; 
     } 

     // Navigation code here 
    } 
} 

查看:

<GridView 
    ItemsSource="{Binding Releases}" 
    ItemTemplate="{StaticResource ReleaseTemplate}" 
    ItemContainerStyle="{StaticResource GridViewItemStyle}" 
    Grid.ColumnSpan="2" 
    Grid.Row="2" 
    Padding="116,0,40,46" 
    SelectedItem="{Binding SelectedRelease, Mode=TwoWay}"/> 

回答

0

我終於找到的最好方法是使用一些代碼。但不是直接從UI導航,我在導航模型中保留了導航邏輯。

所以我只是在GridView迷上了itemClick事件,並在事件處理我鑄造頁面數據上下文到我的視圖模型,然後我簡單地執行從視圖模型的命令。這不容易維護,但它確實保留了MVVM關注點的分離。

private void GridView_ItemClick(object sender, ItemClickEventArgs e) 
{ 
    MyViewModel vm = (MyViewModel)this.DataContext; 

    if(vm.NavigateToSelectionCommand.CanExecute(null)) 
    { 
     vm.NavigateToSelectionCommand.Execute(e.ClickedItem); 
    } 
} 

不過我希望一個更清潔和更易維護的解決方案能夠提供時間。

0

在我看來,與MVVM模式編碼並不意味着一切與代碼相關的應在模型中進行。與用戶界面相關的操作(如導航)仍應在視圖(代碼隱藏)中完成,方法是使用控件中的可用事件。就像GridView的事件鼠標和鍵盤事件一樣。我很多人可能不同意我的觀點,但是在WPF和Silverlight中MVVM模式工作了好幾年之後,我必須說UI界行爲(視圖)和控件的邏輯/功能性之間的良好組合(模型),你也將被迫將幾個涉及UI的東西放到代碼隱藏中。至少,這是我的看法。

你可以做的是創建一個繼承GridView的類(我們稱之爲MyDataGrid)。 然後,您可以使用OnKeyDown覆蓋,並在按下Enter鍵時讓導航進入Vertica。 實際上,你可以讓MyDataGrid外觀和行爲與「亂用」的,就像你想的那麼有沒有額外的代碼,如果你想用同一電網的行爲在你的應用另一個地方(或其他應用程序)。

+0

我原本是WPF開發人員,遷移到這個新的平臺實際上讓我懷疑導航實際上是一個UI關注還是應用程序邏輯問題?它是應用程序工作流程的一部分,但同時也是一個UI運動。 我真的很想知道如何讓MVVM模式變得更少一些,並導航回UI(就像在默認模板中一樣)。 關於GridView無需對其進行擴展,因爲處理Click事件實際上對鍵盤/觸摸/鼠標自然交互作用均勻反應,但它當然與MVVM不兼容。 – Ucodia

+0

是的。很難區分應該是用戶界面還是非用戶界面,因爲在某些情況下,定義因人而異。 當談到如何選擇或獲取價值時,我通常會說這是UI的問題。如果它是雙擊,單擊,按鈕單擊或標籤並使用鍵盤/輸入。這對模型無關緊要。該模型只涉及實際選擇時發生的情況。不怎麼樣。 我不是設計師。如果設計師想出更好的解決方案來解決用戶的工作方式,我想不必改變模型。只有看法。 –

+0

從工作流程/導航的角度來看,有一種情況需要管理UI的狀態。這個關注領域通常用ApplicationController模式解決。 Laurent在他的例子中稱這爲「NavigationService」,但它非常接近於同樣的事物。 ApplicationController可以像switch語句一樣簡單,就像完整的有限狀態機一樣複雜。最主要的是View和/或ViewModel會爲ApplicationController發送一條消息(或者觸發一個事件),然後這個消息會導航到新的View。 –