2017-03-21 11 views
1

マスタービューの詳細ページをルートビューとして持つXamarin Formsアプリケーションがあります。 MVVMパターンを実装しています。c#xamarinはマスターの詳細ページを作成しますMVVM

マイルートページは、ナビゲーションページにラップされた詳細ページと詳細ページへのリンク付きメニューを表示するために使用されるマスターページを読み込みます。

マスターページリストビューを使用してナビゲーションメニューを保持 詳細ページマスターページからすべての選択されたアイテムを保持し、新しいコンテンツページを表示します。

詳細ページで独自のContentPageコンテンツプロパティを使用して、MasterPageから選択したページリンクを表示したいと考えています。 これが可能かどうか、いくつかの選択肢がないかどうかを知りたいと思います。

ここに私のMasterDetailPageのViewModelがあります。ここで

public class PageViewModel: ViewModelBase 
    { 
    public event EventHandler<string> ItemSelectedEventHandler; 
    string _selectedpagelink; 
    public string SelectedPageLink 
    { 
     get { return _selectedpagelink; } 
     set 
     { 
      if (_selectedpagelink != value) 
      { 
       _selectedpagelink = value; 
       OnItemSelected(this,value); 
       OnPropertyChanged(); 
      } 
     } 
    } 




    public ObservableCollection<string> Links => 
    new ObservableCollection<string> 
    { 
     "PageOne", 
     "PageTwo" 
    }; 

    public PageViewModel() 
    { 
     this.SelectedPageLink = this.Links.FirstOrDefault(); 
    } 

    protected virtual void OnItemSelected(object sender , string newPage) 
    { 
     ItemSelectedEventHandler?.Invoke(this, newPage); 
    } 


} 

は、文字列、それはリソースディクショナリを使用してナビゲートすることができ、このようにページの値を変換し、私のコンバータ、です。ここ

public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     var key = value as string; 
     if (key == null) 
     { 
      throw new ArgumentNullException("Resource key is not found", nameof(value)); 
     } 

     return Application.Current.Resources[key]; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

は、コンテンツページを使用して、私のマスターページで、リストビュー

**<ListView 
       x:Name="ListViewMenuMaster" 
       ItemsSource="{Binding Links}" 
       SelectedItem="{Binding SelectedPageLink}" 

       SeparatorVisibility="None" 
       HasUnevenRows="true"> 

      <ListView.Header> 
       <Grid BackgroundColor="#03A9F4"> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="10"/> 
         <ColumnDefinition Width="*"/> 
         <ColumnDefinition Width="10"/> 
        </Grid.ColumnDefinitions> 
        <Grid.RowDefinitions> 
         <RowDefinition Height="30"/> 
         <RowDefinition Height="80"/> 
         <RowDefinition Height="Auto"/> 
         <RowDefinition Height="10"/> 
        </Grid.RowDefinitions> 
        <Label 
       Grid.Column="1" 
       Grid.Row="2" 
       Text="My App Name here" 
       Style="{DynamicResource SubtitleStyle}"/> 

       </Grid> 
      </ListView.Header> 
      <ListView.ItemTemplate> 
       <DataTemplate> 
        <ViewCell> 
         <StackLayout Padding="15,10" HorizontalOptions="FillAndExpand"> 
          <Label VerticalOptions="FillAndExpand" 
        VerticalTextAlignment="Center" 
        Text="{Binding}" 

        FontSize="24"/> 
         </StackLayout> 
        </ViewCell> 
       </DataTemplate> 
      </ListView.ItemTemplate> 
     </ListView>** 

はここでマスターページから選択したリンクが表示される必要があり、私の詳細ページ、

**<ContentPage.BindingContext> 
     <vm:PageViewModel /> 
    </ContentPage.BindingContext> 
    <ContentPage.Resources> 
     <ResourceDictionary> 
      <conv:ResourceLookUpConverter x:Key="resourceLookupConverter"/> 
     </ResourceDictionary> 
    </ContentPage.Resources> 

    *Can the content property below be used to display the selected page links???* 
    <ContentPage Content="{Binding SelectedPageLink, Converter={Binding resourceLookupConverter}}" />** 

コンテンツです私がナビゲートしているページは、非常に簡単なタイプのコンテンツページです。 ViewModelを使わずに、ビューについて何か知っていれば、私はこれをしたいと思います。私の考えは、コンテンツページのコンテンツプロパティが選択されたマスターページのリンクを表示することができますか?

答えて

2

あなたが必要とするものを正しく理解しているかどうかわかりません。 あなたがSelectedPageLinkが選択されているときContentPage(詳細)を開きたい場合は、私は(...ホープは、それはMVVMの規則に従います)あなたはMessagingCenterを使用することができると思う

マスターページがあります。このrepo

に見てみましょう、後ろのコードで、このコード

protected override void OnAppearing() 
    { 
     MessagingCenter.Subscribe<MasterPageViewModel, string>(this, "Detail", (arg1, arg2) => { 

      ((MasterDetailPage)Application.Current.MainPage).Detail = new DetailPage(arg2); 
      ((MasterDetailPage)Application.Current.MainPage).IsPresented = false; 
     }); 
     base.OnAppearing(); 
    } 

    protected override void OnDisappearing() 
    { 
     MessagingCenter.Unsubscribe<MasterPageViewModel, string>(this, "Detail"); 
     base.OnDisappearing(); 
    } 

がある場合項目がリスト

public MyModel SelectedItem 
    { 
     get { return _selectedItem; } 
     set 
     { 
      if (_selectedItem != null) 
       _selectedItem.Selected = false; 

      _selectedItem = value; 

      if (_selectedItem != null) 
      { 
       _selectedItem.Selected = true; 
       MessagingCenter.Send<MasterPageViewModel, string>(this, "Detail", _selectedItem.Name); 
      } 
     } 
    } 
で選択された場合には、そのビューモデルからメッセージを受信します210

arg2には、リストで選択された名前があります。 DetailPageは

はそれが

+0

たちが書いているので、残念ながら、これは、MVVMパターンを破るない提案いただきありがとうございますお役に立てば幸いです(それはDetailPageViewModeに渡され、詳細ページにラベルに結合している)、この名前で作成されますビュー内のロジックを表示します。私がしようとしているのは、タイプのコンテンツページである詳細ページに新しいコンテンツページを表示することです。マスターページメニューからリンクを選択するたびに、目的のページビューをロードする必要があります。 – Ahhzeee

+0

MVVMパターンが破損していませんか? MVVMは誰かが受け取るメッセージのみを送信します。私は、MessagingCenterがMVVMフレームワークの代わりに他のものを使用していると思います。http://stackoverflow.com/a/3388241/4399386 –

+0

あなたは正しいです。 – Ahhzeee

関連する問題