2012-02-23 7 views
2

이 프로젝트에서 MVVM을 사용하고 있습니다. 고객 컬렉션에 바인딩하는 목록 상자가 있습니다.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에 추가 할 수있는 선택 항목을 가져온 다음 데이터를 얻기 위해 그것을 사용하는 방법을 알아낼 수 없습니다 : 나는 elementselected의 detailsPage 사용하여 ID를 탐색하는 이벤트를 만들려고합니다. 예제 또는 자습서가 도움이 될 것입니다. 감사합니다 :)

답변

6

ViewModel (Customers 속성 옆에있는)에서 "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

그와 양방향 내가 전에이 방법을 사용 – vidalsasoon

+0

바인딩 사용하는지 "의 selectedItem"을 만들지 만, 그것은 부작용이있다처럼 보인다 - 예를 들어, 당신은 통합하고 전화를 특정 로직을 뷰 모델에 추가 할 수 있으므로 더 이상 이식성이 없습니다. 둘째, SelectedCustomer를 설정할 때 고객 정보가 포함 된 새 페이지로 이동합니다. –

+0

그리고 null도 확인해야합니다. –

1

AlexDrenea는 당신에게 당신의 ViewModel의 속성에 selectedItem가 결합하는 좋은 방법을 제공합니다. MVVM 아키텍처에서이를 기반으로 탐색하고 싶다면 메시징을 사용하여이를 완료하는 것이 좋습니다.

블로그 포스트에서 잠시 후에 설명했는데, MVVMLight에서이를 수행하는 간단한 요약은 애플리케이션 레벨에있는 Navigator 클래스를 만드는 것입니다. 당신이, 그리고 ...

_navigator = new Navigator(this.RootFrame); 

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

:

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에 그것을 참조를 전달 내비게이션 메시지를 보내는 방법에 대한 몇 가지 선택 사항.

옵션 1 : ViewModel에서 PropertyChanged 이벤트 (INotifyPropertyChanged의 일부)를 연결하고 SelectedItem 속성이 변경 될 때 적절한 메시지를 보냅니다.

옵션 2 : ListBox의 SelectionChanged 이벤트에 연결하십시오. MVVMLight의 EventToCommand를 사용하여 해당 이벤트를 내 ViewModel의 RelayCommand로 보낸 다음 적절하게 응답하여 Navigator 객체에 메시지를 보냅니다.

나는 더 많은 세부 사항이 다루 : http://www.smartchitecture.com/?p=27

+0

내가 정말로 당신의 아이디어를 잘 이해하지 못한다면, 나는 네비게이터 클래스를 만들고이 액션을 실현해야 할 때마다 타겟 페이지를 정의해야합니다! 그건 좋은 방법이 아니야? –

+0

게다가, 그 ID를 복구하고 데이터를 얻기 위해 다른 웹 요청에 넣고 싶습니다 ..나는 그것을 위해 onNavigatedTO를 사용해야 만한다는 것을 알고 있지만 어떻게 detailsViewModel에 그것을 전달할 수 있습니까?! 감사합니다 :) –

+0

대상 페이지를 명령 매개 변수로 정의하고 탐색기를 더 선언적인 위치로 이동시키는 탐색기로 전달할 수 있습니다. 그러나 내 탐색 방법이 모두 중앙 집중화되어 있기 때문에 접근 방식이 마음에 들었습니다. 다시 정리하거나 이름을 바꿔야 만 할 경우 변경해야 할 한 곳만 있습니다. – Robaticus

관련 문제