2010-08-05 2 views
2

MVVM Light Toolkit을 사용하려고합니다. 그런 작은 애플 리케이션을위한 다중 ViewModel이 과잉이라고 생각하지만, 나는 그 개념을 좋아한다. 여전히 이해할 수없는 것은 ListBox에서 선택 항목이 변경 될 때 한 페이지에서 다른 페이지로 이동하는 방법 (또는 "무엇이 권장되는 방법"이라고 말해야하는지)입니다.ListBox 선택 변경시 페이지 탐색을 수행하는 적절한 방법은 무엇입니까

이 툴킷의 가장 큰 문제점은 MVVM이 프레임 워크 내에서 무엇인지 (그 비전)를 보여주기보다는 다른 소스를 통해 MVVM을 배워야한다는 것입니다. 샘플 및 설명서가 함께 제공됩니다. 서로 다른 개념을 보여주는 샘플이 있습니까? 그리고 제발, 비디오가 없습니다.

답변

1

ListBox ItemTemplate을 수정하여 각 항목을 HyperlinkButton으로 지정하고 NavigateURI 특성을 탐색 할 페이지로 설정해 보았습니까?

+0

흠, 웹 생각, 나는 이것에 익숙하지 않다. 따라서 각 ListBoxItem에는 선택한 항목의 ID를 참조하는 쿼리 매개 변수가 포함 된 URI가 포함 된 HyperlinkButton (링크처럼 보이지 않는 템플릿이 분명히 있음)이 포함되어있는 것이 좋습니다. 다른 사람들은 Windows Phone 7에서이 작업을 수행하는 방법에 동의합니다. 그런데 실버 라이트를 처음 접했을 때, 그리드와 바운드 아이 컨트롤을 버튼 안에 넣었을 때 아무 것도 보지 못하는 것 같았습니다. 내가 뭘 놓치고 있니? –

+0

거기에 두 가지 질문이 있고 두 번째 질문은 더 자세한 내용을 묻는 자체 질문입니다. HyperlinkButton까지, 그래, 그게 내가 시도 할거야. HyperlinkButton 컨트롤은 다른 것들처럼 보이도록 스타일이 매우 강력합니다. 예를 들어, 수평 StackPanel 안에 HyperlinkButton 컨트롤이있는 탭 스트립을 쉽게 만들 수 있습니다. –

+0

가장 좋은 답으로 뽑혔지만, 마침내 버튼을 사용하고 있습니다. –

1

보기에서 코드 숨김없이이 작업을 수행하는 방법 (목록 상자에서 선택한 선택 사항에 따라 세부 정보 페이지로 이동)을 아직 파악하지 못했습니다.

<ListBox x:Name="MainListBox" Margin="0,0,-12,0" ItemsSource="{Binding Items}" 
    SelectionChanged="MainListBox_SelectionChanged" 
    SelectedItem="{Binding Path=SelectedListItem, Mode=TwoWay}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
       <StackPanel Margin="0,0,0,17" Width="432"> 
        <TextBlock Text="{Binding LineOne}" TextWrapping="Wrap" Style="{StaticResource PhoneTextExtraLargeStyle}"/> 
        <TextBlock Text="{Binding LineTwo}" TextWrapping="Wrap" Margin="12,-6,12,0" Style="{StaticResource PhoneTextSubtleStyle}"/> 
       </StackPanel> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

첫째, 바인드 위의 당 양방향이 당신의 ViewModel의 속성에 바인딩 목록 상자의 selectedItem가 속성 (: 당신이보기에 조금 숨김 필요로 확인하는 경우 그러나, 나는 추천 무엇 상기에서 SelectedListItem).

그런 다음이 페이지에 대한 코드 숨김에서 MainListBox_SelectionChanged에 대한 처리기를 구현 :

// Handle selection changed on ListBox 
    private void MainListBox_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     // If selected index is -1 (no selection) do nothing 
     if (MainListBox.SelectedIndex == -1) 
      return; 

     // Navigate to the new page 
     NavigationService.Navigate(new Uri("/DetailsPage.xaml", UriKind.Relative)); 

    } 

이것은 당신이 당신의 주요 관점에서 필요로하는 유일한 코드 숨김입니다.

public const string SelectedListItemPropertyName = "SelectedListItem"; 
    private ItemViewModel _SelectedListItem; 
    /// <summary> 
    /// Sample ViewModel property; this property is used in the view to display its value using a Binding 
    /// </summary> 
    /// <returns></returns> 
    public ItemViewModel SelectedListItem 
    { 
     get 
     { 
      return _SelectedListItem; 
     } 
     set 
     { 
      if (value != _SelectedListItem) 
      { 
       _SelectedListItem = value; 
       RaisePropertyChanged(SelectedListItemPropertyName); 
      } 
     } 
    } 

지금, 세부 사항 페이지 (문맥이 선택한 어떤 목록 항목 인)에 전달 된 컨텍스트를 얻는 데 트릭은 당신이 DataContext를 설정할 필요가

: 메인 뷰 모델에서

당신은 SelectedListItem 속성을 필요 세부 정보보기 :

public DetailsPage() 
{ 
    InitializeComponent(); 
    if (DataContext == null) 
     DataContext = App.ViewModel.SelectedListItem; 

} 

희망이 있습니다.

1

결국 사용자 정의 개체를 설정 한 후에 탐색하는 것 이상의 작업을 수행 할 수 있습니다.

여기에이 작업을 수행하는 MVVM 방식이 있습니다.

먼저 그런 다음 탭에 결합 상호 작용 트리거를 정의 할 수 있습니다

<ListBox ItemsSource="{Binding Events}" Margin="0,0,-12,0" SelectedItem="{Binding SelectedEvent, Mode=TwoWay}"> 

SelectedEvent 재산

public const string SelectedEventPropertyName = "SelectedEvent"; 

    private Event _selectedEvent; 


    public Event SelectedEvent 
    { 
     get {return _selectedEvent;} 

     set 
     { 
      if (_selectedEvent == value) 
      { 
       return; 
      } 

      var oldValue = _selectedEvent; 
      _selectedEvent = value; 

      // Update bindings and broadcast change using GalaSoft.MvvmLight.Messenging 
      RaisePropertyChanged(SelectedEventPropertyName, oldValue, value, true); 
     } 
    } 

를 선언하여 목록 상자는 당신의 ViewModel의 속성 항목을 선택 바인딩 할 수 있습니다 이벤트

<i:Interaction.Triggers> 
    <i:EventTrigger EventName="Tap"> 
     <cmd:EventToCommand Command="{Binding EventPageCommand, Mode=OneWay}"/> 
    </i:EventTrigger> 
</i:Interaction.Triggers> 

viewmodel에서 EventPageCommand RelayCommand 같이

public RelayCommand EventPageCommand { get; private set; } 
public MainViewModel() 
{ 
    EventPageCommand = new RelayCommand(GoToEventPage); 
} 

그리고 마지막으로 현재 설정되어있는 귀하의 GoToEventPage 방법

private void GoToEventPage() 
{ 
    _navigationService.NavigateTo(new Uri("/EventPage.xaml", UriKind.Relative)); 
} 

당신의 새로운 페이지로 이동하기 전에 다른 작업을 할 수 있습니다, 플러스 목록 상자에서 선택한 항목을 선언 재산에서 당신은 그것도 묶었습니다.

+0

두 항목 모두 선택된 바인딩의 장점을 사용하는 좋은 솔루션이지만 탭을 별도로 모니터링하여 "선택 변경"이 부족하지는 않습니다. 감사. –

관련 문제