2012-02-23 92 views
2

我在這個項目中使用MVVM列表框,我有一個綁定到客戶的集合的列表框。我想創建一個事件來瀏覽detailsPage使用ID的elementselected的:獲取將selectedItem使用MVVM

<ListBox ItemsSource="{Binding Customers}" x:Name="state_list" SelectionChanged="state_list_SelectionChanged"> 
      <i:Interaction.Triggers> 
       <i:EventTrigger EventName="selectionchanged"> 
        <cmd:EventToCommand Command="{Binding stateSelectedCommand}" PassEventArgsToCommand="True" /> 

       </i:EventTrigger> 
      </i:Interaction.Triggers> 
       <ListBox.ItemTemplate> 
       <DataTemplate> 
        <StackPanel Orientation="Vertical"> 
         <TextBlock Text="{Binding nom}" /> 
         <!--TextBlock Text="{Binding LastName}" /> 
         <TextBlock Text="{Binding Text, ElementName=tbCount}" /--> 
        </StackPanel> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 

我無法弄清楚如何讓所選擇的項目,將其添加到URI,然後用它來獲取數據。一個例子或教程將會有所幫助。謝謝:)

回答

6

我將創建一個視圖模型一個「SelectedCustomer」屬性(在你旁邊的客戶屬性),並將其綁定到的SelectedItem。然後,在該屬性的設置器上,您可以導航到所需的頁面。這樣你可以消除混亂的事件和命令。

<ListBox x:Name="state_list 
     ItemsSource="{Binding Customers}" 
     SelectedItem="{Binding SelectedCustomer, Mode=TwoWay}"> 

...

public Customer SelectedCustomer 
{ 
    get 
    { 
    return _selectedCustomer; 
    } 
    set 
    { 
    if (value != null) 
    { 
    _selectedCustomer = value; 
    //Navigate to your page here, either with Navigator class or any other mechanism you have in place for changing content on screen 
    } 
    } 

} 
+2

是,確保「的SelectedItem」採用雙向綁定 – vidalsasoon 2012-02-23 19:14:35

+0

我以前用過這種方法,但現在看來似乎有副作用 - 例如,你的手機整合特定的邏輯放入你的視圖模型中,所以它不再是可移植的。其次,當您設置SelectedCustomer時,您不會簽署合同,您將轉到一個新頁面,其中包含客戶詳細信息 – 2012-02-23 19:14:52

+0

而且您還需要檢查空值 – 2012-02-23 19:17:44

1

AlexDrenea給你結合的SelectedItem在您的視圖模型屬性的好方法。如果您想在MVVM體系結構中基於此導航,我會建議使用消息傳遞來完成它。

我在一篇博客文章中,我做了,而後蓋這一點,但內MVVMLight這樣做的簡短總結,是創建一個坐落在應用程序級別導航類。

public class Navigator 
    { 

     private PhoneApplicatoinFrame RootFrame; 

     public Navigator(PhoneApplicationFrame frame) 
     { 
      RootFrame = frame; 
      RegisterMessages(); 
     } 

     private void RegisterMessages() 
     { 
      Messenger.Default.Register<ShowTrackerMessage>(this, ShowTracker); 
     } 

     private void ShowTracker(ShowTrackerMessage msg) 
     { 
      RootFrame.Navigate(new Uri("/Views/ItemLocationCompassView.xaml", UriKind.RelativeOrAbsolute)); 
     } 

} 

然後,作爲應用程序的一部分啓動,創建和引用傳遞到您的RootFrame:

private static Navigator _navigator; 
    public static Navigator Nav 
    { 
     get { return _navigator; } 
    } 

...

_navigator = new Navigator(this.RootFrame); 

然後,你有關於您如何發送導航消息的幾項選擇。

選項1:在您的ViewModel中,掛入PropertyChanged事件(INotifyPropertyChanged的一部分),並在SelectedItem屬性更改時發送相應的消息。

選項2:扎入你的ListBox的SelectionChanged事件。我用的是MVVMLight的EventToCommand該事件發送到RelayCommand在我的視圖模型,然後作出適當的反應將消息發送到導航對象。

我更詳細地涵蓋這樣的:http://www.smartchitecture.com/?p=27

+0

如果我真的擺脫了你的想法,我必須創建一個導航類,併爲每次需要實現此操作時定義目標頁面!這不是好的方法嗎? – 2012-02-27 15:35:05

+0

除此之外,我想恢復該ID並將其放入另一個Web請求以獲取數據..我知道我必須使用onNavigatedTO,但我怎麼能通過它detailsViewModel ..!謝謝:) – 2012-02-27 16:44:32

+0

您可能可以將目標頁面定義爲命令參數,並將其傳遞給導航器,導航器將您的導航移至更具聲明性的位置。不過,我喜歡我的方法,因爲我的所有導航都是集中式的,所以如果我必須重新排列或重命名事物,我只能有一個地方去改變它們。 – Robaticus 2012-02-27 23:35:24

相關問題