2012-02-14 2 views
2

하나의 ViewModel과 두 개의 Views가 있습니다. ViewModel에서 View2로 어떻게 이동할 수 있습니까? Silverlight에서 ViewModel의 여러 뷰를 여는 데 PRISM을 사용해야한다고 읽었습니다. PRISM을위한 대안이 있습니까?silverlight에서 viewmodel의 한보기에서 다른보기로 이동하는 방법은 무엇입니까?

+0

'보기 열기'는 무엇을 의미합니까? 그곳으로 가거나 무엇을 탐색하고 싶습니까? –

+1

예! 한보기에서 다른보기로 이동하십시오. – Prathibha

답변

4

viewmodel에서보기 논리를 사용하지 않는 것이 좋습니다. 귀하의 뷰 모델은 뷰에 대해 아무 것도 알지 못합니다. viewmodel이 탐색 할 시간임을 알리는 속성을 설정하는 것이 더 좋습니다.

뷰 모델 :

using System.ComponentModel; 

namespace ViewModels 
{ 
    public class MyViewModel : INotifyPropertyChanged 
    { 
     public event PropertyChangedEventHandler PropertyChanged; 
     private void NotifyPropertyChanged(string propertyName) 
     { 
      if (PropertyChanged == null) return; 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 

     private bool _DoneDoingStuff; 
     public bool DoneDoingStuff 
     { 
      get 
      { 
       return _DoneDoingStuff; 
      } 
      set 
      { 
       if (_DoneDoingStuff != value) 
       { 
        _DoneDoingStuff = value; 
        NotifyPropertyChanged("DoneDoingStuff"); 
       } 
      } 
     } 
    } 
} 

보기 : 다음은 예입니다

<navigation:Page 
    x:Class="Views.MyView" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 
    xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions" 
    xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation" 
    xmlns:vm="clr-namespace:ViewModels"> 
    <navigation:Page.Resources> 
     <vm:MyViewModel 
      x:Key="MyViewModelInstance" /> 
    </navigation:Page.Resources> 
    <Grid 
     x:Name="LayoutRoot" 
     DataContext="{Binding Source={StaticResource MyViewModelInstance}}"> 
     <i:Interaction.Triggers> 
      <ei:DataTrigger 
       Binding="{Binding DoneDoingStuff}" 
       Value="True"> 
       <ei:HyperlinkAction 
        NavigateUri="AnotherPage.xaml" /> 
      </ei:DataTrigger> 
     </i:Interaction.Triggers> 
    </Grid> 
</navigation:Page> 
  • 사용 당신의 ViewModel에서 DoneDoingStuff 속성을 설정 DataTriggerBinding 재산 및 Value 속성을 "True"로 설정합니다. DataTrigger은 viewmodel의 DoneDoingStuff이 true로 설정된 경우 트리거됩니다.

  • 이제 탐색을 위해 트리거 조치가 필요합니다. 이동하려는 페이지에 NavigateUri 속성이 설정된 HyperlinkAction 속성을 사용하십시오.

  • 것은 System.Windows.Interactivity, System.Windows.Controls.NavigationMicrosoft.Expression.Interactions 당신의 참조에 어셈블리를해야합니다.

처음에는 너무 많은 것처럼 보일 수도 있지만 이제는보기 로직이 있어야합니다.

1

PRISM을 사용할 필요는 없지만 가장 좋을 수 있습니다.

내가 한 일은 (그리고 엉성함) 시작 화면에서 첫 번째보기를로드 할 탐색 프레임이있는 MainView 페이지를 갖는 것입니다. MainView는 UserControl이 아닌 Page이어야합니다. xaml에 uri 매핑이있는 탐색 프레임이 있어야하며 MainView 페이지의 코드 뒤에 공유/정적으로 선언 된 프레임이 있어야하고 프레임의로드 된 이벤트 (xaml에 있음)를 다음과 같이 설정해야합니다.

MainView.MainContentFrame.Navigate(New Uri("/SecondView", UriKind.Relative)) 

이 아마 어떤 방법으로 MVVM 패턴을 위반하고 그것을 할 수있는 좋은 방법이되지 않을 수도 있습니다,하지만 그것을 작동 :

Public Shared MainContentFrame As Frame 
Private Sub MainContentFrameXaml_Loaded(sender As System.Object, e As System.Windows.RoutedEventArgs) 
    MainContentFrame = TryCast(sender, Frame) 
End Sub 
그런 다음 뷰 모델에 그냥 호출 할 수 있습니다. 지금까지 PRISM을 사용했던 방식입니다.

+0

도움 주셔서 감사합니다 !! 그것은 일했습니다 .. – Prathibha

+0

@ user672094 도움이된다면 대답으로 답을 표시하십시오 ... 나는 대표를 사랑합니다! –

관련 문제