国产凹凸在线-国产拗女一区二区三区-国产白白视-国产白领-国产白拍-国产白丝jk被疯狂输-国产白丝喷-国产白丝在线

金喜正规买球

Xamarin Forms的Prism第二部分:基本導航和依賴注入(Dependency Injection)模式

原創(chuàng)|使用教程|編輯:黃竹雯|2016-09-18 18:01:27.000|閱讀 1777 次

概述:本系列的第2部分展示了Prism如何在一個MVVM應(yīng)用程序中啟動導航。

# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>

相關(guān)鏈接:

前一篇文章中,我們已經(jīng)開始介紹在Xamarin Forms應(yīng)用程序中如何利用Prism(6.2)的新版本來實現(xiàn)MVVM模式的基本概念。到目前為止,我們還沒有看到什么特別的東西是我們用另一個框架做不到的:我們在上一篇文章中創(chuàng)建了一個視圖(View)、一個視圖模型(ViewModel),然后我們通過綁定連接它們。在這篇文章中,我們將看到Prism如何幫助處理一個在MVVM應(yīng)用程序中很難處理的非常常見的場景:導航和頁面的生命周期。

Xamarin Forms的Prism第二部分:基本導航和依賴注入(Dependency Injection)模式

正如我們在前一篇文章中提到的,我們要為TrackSeries——一個提供電視節(jié)目信息的網(wǎng)站,創(chuàng)建一個簡單的客戶端。該應(yīng)用程序?qū)@示當前的頂級系列,將允許用戶發(fā)現(xiàn)更多關(guān)于它的內(nèi)容。為了實現(xiàn)這一目標,我們可以用一組網(wǎng)站提供的REST服務(wù),這是非常簡單的使用和處理REST服務(wù)的遵循標準的最佳實踐:你調(diào)用一個使用HTTP命令的URL,接收返回一個JSON響應(yīng)結(jié)果。

舉個例子,如果你想知道哪些是頂級系列,你可以執(zhí)行一個HTTP GET請求到以下URL:。服務(wù)將返回給你一個JSON響應(yīng),包含頂級系列的所有細節(jié):

[
   {
      "id":121361,
      "name":"Game of Thrones",
      "followers":10230,
      "firstAired":"2011-04-17T21:00:00-04:00",
      "country":"us",
      "overview":"Seven noble families fight for control of the mythical land of Westeros. Friction between the houses leads to full-scale war. All while a very ancient evil awakens in the farthest north. Amidst the war, a neglected military order of misfits, the Night's Watch, is all that stands between the realms of men and the icy horrors beyond.",
      "runtime":55,
      "status":"Continuing",
      "network":"HBO",
      "airDay":"Sunday",
      "airTime":"9:00 PM",
      "contentRating":"TV-MA",
      "imdbId":"tt0944947",
      "tvdbId":121361,
      "tmdbId":1399,
      "language":"en",
      "images":{
         "poster":"//static.trackseries.tv/banners/posters/121361-49.jpg",
         "fanart":"//static.trackseries.tv/banners/fanart/original/121361-15.jpg",
         "banner":"//static.trackseries.tv/banners/graphical/121361-g22.jpg"
      },
      "genres":[
         {
            "id":2,
            "name":"Adventure"
         },
         {
            "id":4,
            "name":"Drama"
         },
         {
            "id":5,
            "name":"Fantasy"
         }
      ],
      "added":"2014-08-08T13:30:46.227",
      "lastUpdated":"2016-08-18T03:03:50.05",
      "followedByUser":false,
      "slugName":"game-of-thrones"
   },
   {
      "id":257655,
      "name":"Arrow",
      "followers":7517,
      "firstAired":"2012-10-10T20:00:00-04:00",
      "country":"us",
      "overview":"Oliver Queen and his father are lost at sea when their luxury yacht sinks. His father doesn't survive. Oliver survives on an uncharted island for five years learning to fight, but also learning about his father's corruption and unscrupulous business dealings. He returns to civilization a changed man, determined to put things right. He disguises himself with the hood of one of his mysterious island mentors, arms himself with a bow and sets about hunting down the men and women who have corrupted his city.",
      "runtime":45,
      "status":"Continuing",
      "network":"The CW",
      "airDay":"Wednesday",
      "airTime":"8:00 PM",
      "contentRating":"TV-14",
      "imdbId":"tt2193021",
      "tvdbId":257655,
      "tmdbId":1412,
      "language":"en",
      "images":{
         "poster":"//static.trackseries.tv/banners/posters/257655-8.jpg",
         "fanart":"//static.trackseries.tv/banners/fanart/original/257655-47.jpg",
         "banner":"//static.trackseries.tv/banners/graphical/257655-g9.jpg"
      },
      "genres":[
         {
            "id":1,
            "name":"Action"
         },
         {
            "id":2,
            "name":"Adventure"
         },
         {
            "id":4,
            "name":"Drama"
         }
      ],
      "added":"2014-08-08T13:37:00.133",
      "lastUpdated":"2016-08-15T03:11:32.013",
      "followedByUser":false,
      "slugName":"arrow"
   },
   {
      "id":153021,
      "name":"The Walking Dead",
      "followers":7185,
      "firstAired":"2010-10-31T21:00:00-04:00",
      "country":"us",
      "overview":"The world we knew is gone. An epidemic of apocalyptic proportions has swept the globe causing the dead to rise and feed on the living. In a matter of months society has crumbled. In a world ruled by the dead, we are forced to finally start living. Based on a comic book series of the same name by Robert Kirkman, this AMC project focuses on the world after a zombie apocalypse. The series follows a police officer, Rick Grimes, who wakes up from a coma to find the world ravaged with zombies. Looking for his family, he and a group of survivors attempt to battle against the zombies in order to stay alive.\n",
      "runtime":50,
      "status":"Continuing",
      "network":"AMC",
      "airDay":"Sunday",
      "airTime":"9:00 PM",
      "contentRating":"TV-MA",
      "imdbId":"tt1520211",
      "tvdbId":153021,
      "tmdbId":1402,
      "language":"en",
      "images":{
         "poster":"//static.trackseries.tv/banners/posters/153021-38.jpg",
         "fanart":"//static.trackseries.tv/banners/fanart/original/153021-77.jpg",
         "banner":"//static.trackseries.tv/banners/graphical/153021-g44.jpg"
      },
      "genres":[
         {
            "id":1,
            "name":"Action"
         },
         {
            "id":4,
            "name":"Drama"
         },
         {
            "id":6,
            "name":"Horror"
         },
         {
            "id":20,
            "name":"Suspense"
         }
      ],
      "added":"2014-08-08T13:31:18.617",
      "lastUpdated":"2016-08-18T03:04:00.28",
      "followedByUser":false,
      "slugName":"the-walking-dead"
   },
   {
      "id":279121,
      "name":"The Flash (2014)",
      "followers":7069,
      "firstAired":"2014-10-07T20:00:00-04:00",
      "country":"us",
      "overview":"After a particle accelerator causes a freak storm, CSI Investigator Barry Allen is struck by lightning and falls into a coma. Months later he awakens with the power of super speed, granting him the ability to move through Central City like an unseen guardian angel. Though initially excited by his newfound powers, Barry is shocked to discover he is not the only \"meta-human\" who was created in the wake of the accelerator explosion – and not everyone is using their new powers for good. Barry partners with S.T.A.R. Labs and dedicates his life to protect the innocent. For now, only a few close friends and associates know that Barry is literally the fastest man alive, but it won't be long before the world learns what Barry Allen has become... The Flash.",
      "runtime":45,
      "status":"Continuing",
      "network":"The CW",
      "airDay":"Tuesday",
      "airTime":"8:00 PM",
      "contentRating":"TV-14",
      "imdbId":"tt3107288",
      "tvdbId":279121,
      "tmdbId":60735,
      "language":"en",
      "images":{
         "poster":"//static.trackseries.tv/banners/posters/279121-37.jpg",
         "fanart":"//static.trackseries.tv/banners/fanart/original/279121-23.jpg",
         "banner":"//static.trackseries.tv/banners/graphical/279121-g7.jpg"
      },
      "genres":[
         {
            "id":1,
            "name":"Action"
         },
         {
            "id":2,
            "name":"Adventure"
         },
         {
            "id":4,
            "name":"Drama"
         },
         {
            "id":8,
            "name":"Science-Fiction"
         }
      ],
      "added":"2014-08-08T13:45:59.087",
      "lastUpdated":"2016-08-17T03:09:18.7",
      "followedByUser":false,
      "slugName":"the-flash-2014"
   },
   {
      "id":80379,
      "name":"The Big Bang Theory",
      "followers":6922,
      "firstAired":"2007-09-25T20:00:00-04:00",
      "country":"us",
      "overview":"What happens when hyperintelligent roommates Sheldon and Leonard meet Penny, a free-spirited beauty moving in next door, and realize they know next to nothing about life outside of the lab. Rounding out the crew are the smarmy Wolowitz, who thinks he's as sexy as he is brainy, and Koothrappali, who suffers from an inability to speak in the presence of a woman.",
      "runtime":25,
      "status":"Continuing",
      "network":"CBS",
      "airDay":"Monday",
      "airTime":"8:00 PM",
      "contentRating":"TV-PG",
      "imdbId":"tt0898266",
      "tvdbId":80379,
      "tmdbId":1418,
      "language":"en",
      "images":{
         "poster":"//static.trackseries.tv/banners/posters/80379-43.jpg",
         "fanart":"//static.trackseries.tv/banners/fanart/original/80379-38.jpg",
         "banner":"//static.trackseries.tv/banners/graphical/80379-g28.jpg"
      },
      "genres":[
         {
            "id":3,
            "name":"Comedy"
         }
      ],
      "added":"2014-08-08T13:27:13.18",
      "lastUpdated":"2016-08-18T03:03:10.947",
      "followedByUser":false,
      "slugName":"the-big-bang-theory"
   },
   {
      "id":176941,
      "name":"Sherlock",
      "followers":6387,
      "firstAired":"2010-07-25T20:30:00+01:00",
      "country":"gb",
      "overview":"Sherlock is a British television crime drama that presents a contemporary adaptation of Sir Arthur Conan Doyle's Sherlock Holmes detective stories. Created by Steven Moffat and Mark Gatiss, it stars Benedict Cumberbatch as Sherlock Holmes and Martin Freeman as Doctor John Watson.",
      "runtime":90,
      "status":"Continuing",
      "network":"BBC One",
      "airDay":"Sunday",
      "airTime":"8:30 PM",
      "contentRating":"TV-14",
      "imdbId":"tt1475582",
      "tvdbId":176941,
      "tmdbId":19885,
      "language":"en",
      "images":{
         "poster":"//static.trackseries.tv/banners/posters/176941-11.jpg",
         "fanart":"//static.trackseries.tv/banners/fanart/original/176941-3.jpg",
         "banner":"//static.trackseries.tv/banners/graphical/176941-g5.jpg"
      },
      "genres":[
         {
            "id":2,
            "name":"Adventure"
         },
         {
            "id":4,
            "name":"Drama"
         },
         {
            "id":14,
            "name":"Crime"
         },
         {
            "id":16,
            "name":"Mystery"
         },
         {
            "id":21,
            "name":"Thriller"
         }
      ],
      "added":"2014-08-08T13:32:27.247",
      "lastUpdated":"2016-08-17T03:07:09.747",
      "followedByUser":false,
      "slugName":"sherlock"
   },
   {
      "id":263365,
      "name":"Marvel's Agents of S.H.I.E.L.D.",
      "followers":5372,
      "firstAired":"2013-09-24T22:00:00-04:00",
      "country":"us",
      "overview":"Phil Coulson (Clark Gregg, reprising his role from \"The Avengers\" and \"Iron Man\" ) heads an elite team of fellow agents with the worldwide law-enforcement organization known as SHIELD (Strategic Homeland Intervention Enforcement and Logistics Division), as they investigate strange occurrences around the globe. Its members -- each of whom brings a specialty to the group -- work with Coulson to protect those who cannot protect themselves from extraordinary and inconceivable threats, including a formidable group known as Hydra.",
      "runtime":45,
      "status":"Continuing",
      "network":"ABC (US)",
      "airDay":"Tuesday",
      "airTime":"10:00 PM",
      "contentRating":"TV-PG",
      "imdbId":"tt2364582",
      "tvdbId":263365,
      "tmdbId":1403,
      "language":"en",
      "images":{
         "poster":"//static.trackseries.tv/banners/posters/263365-16.jpg",
         "fanart":"//static.trackseries.tv/banners/fanart/original/263365-26.jpg",
         "banner":"//static.trackseries.tv/banners/graphical/263365-g7.jpg"
      },
      "genres":[
         {
            "id":1,
            "name":"Action"
         },
         {
            "id":2,
            "name":"Adventure"
         },
         {
            "id":4,
            "name":"Drama"
         },
         {
            "id":5,
            "name":"Fantasy"
         },
         {
            "id":8,
            "name":"Science-Fiction"
         }
      ],
      "added":"2014-08-08T13:39:45.967",
      "lastUpdated":"2016-08-18T03:05:30.987",
      "followedByUser":false,
      "slugName":"marvels-agents-of-shield"
   },
   {
      "id":81189,
      "name":"Breaking Bad",
      "followers":5227,
      "firstAired":"2008-01-20T21:00:00-04:00",
      "country":"us",
      "overview":"Walter White, a struggling high school chemistry teacher, is diagnosed with advanced lung cancer. He turns to a life of crime, producing and selling methamphetamine accompanied by a former student, Jesse Pinkman, with the aim of securing his family's financial future before he dies.",
      "runtime":45,
      "status":"Ended",
      "network":"AMC",
      "airDay":"Sunday",
      "airTime":"9:00 PM",
      "contentRating":"TV-MA",
      "imdbId":"tt0903747",
      "tvdbId":81189,
      "tmdbId":1396,
      "language":"en",
      "images":{
         "poster":"//static.trackseries.tv/banners/posters/81189-10.jpg",
         "fanart":"//static.trackseries.tv/banners/fanart/original/81189-21.jpg",
         "banner":"//static.trackseries.tv/banners/graphical/81189-g21.jpg"
      },
      "genres":[
         {
            "id":4,
            "name":"Drama"
         },
         {
            "id":14,
            "name":"Crime"
         },
         {
            "id":20,
            "name":"Suspense"
         },
         {
            "id":21,
            "name":"Thriller"
         }
      ],
      "added":"2014-08-08T13:27:33.917",
      "lastUpdated":"2016-08-13T03:01:47.063",
      "followedByUser":false,
      "slugName":"breaking-bad"
   },
   {
      "id":247808,
      "name":"Suits",
      "followers":4835,
      "firstAired":"2011-06-24T21:00:00-04:00",
      "country":"us",
      "overview":"Suits follows college drop-out Mike Ross, who accidentally lands a job with one of New York's best legal closers, Harvey Specter. They soon become a winning team with Mike's raw talent and photographic memory, and Mike soon reminds Harvey of why he went into the field of law in the first place.",
      "runtime":45,
      "status":"Continuing",
      "network":"USA Network",
      "airDay":"Wednesday",
      "airTime":"9:00 PM",
      "contentRating":"TV-14",
      "imdbId":"tt1632701",
      "tvdbId":247808,
      "tmdbId":37680,
      "language":"en",
      "images":{
         "poster":"//static.trackseries.tv/banners/posters/247808-27.jpg",
         "fanart":"//static.trackseries.tv/banners/fanart/original/247808-43.jpg",
         "banner":"//static.trackseries.tv/banners/graphical/247808-g17.jpg"
      },
      "genres":[
         {
            "id":4,
            "name":"Drama"
         }
      ],
      "added":"2014-08-08T13:33:45.423",
      "lastUpdated":"2016-08-18T03:04:21.37",
      "followedByUser":false,
      "slugName":"suits"
   },
   {
      "id":274431,
      "name":"Gotham",
      "followers":4718,
      "firstAired":"2014-09-23T20:00:00-04:00",
      "country":"us",
      "overview":"An action-drama series following rookie detective James Gordon as he battles villains and corruption in pre-Batman Gotham City.",
      "runtime":45,
      "status":"Continuing",
      "network":"FOX (US)",
      "airDay":"Monday",
      "airTime":"8:00 PM",
      "contentRating":"TV-14",
      "imdbId":"tt3749900",
      "tvdbId":274431,
      "tmdbId":60708,
      "language":"en",
      "images":{
         "poster":"//static.trackseries.tv/banners/posters/274431-17.jpg",
         "fanart":"//static.trackseries.tv/banners/fanart/original/274431-22.jpg",
         "banner":"//static.trackseries.tv/banners/graphical/274431-g6.jpg"
      },
      "genres":[
         {
            "id":1,
            "name":"Action"
         },
         {
            "id":4,
            "name":"Drama"
         },
         {
            "id":8,
            "name":"Science-Fiction"
         },
         {
            "id":14,
            "name":"Crime"
         },
         {
            "id":21,
            "name":"Thriller"
         }
      ],
      "added":"2014-08-08T13:44:55.4",
      "lastUpdated":"2016-08-17T03:08:55.473",
      "followedByUser":false,
      "slugName":"gotham"
   }
]

為了使用這些應(yīng)用程序中的API,我用一組方法創(chuàng)建了一個稱為TsApiService的類,通過.NET框架和流行的JSON.NET庫的HttpClient類,負責下載JSON,解析它并返回一組可以使用C#很容易地操縱的對象。為了更好地構(gòu)成我的解決方案, 我已經(jīng)決定把所有的通信相關(guān)類與REST API (如服務(wù)和實體)放置在另一個叫做InfoSeries.Core的便攜式類庫(Portable Class Library)中,這是一個與實際Xamarin Forms應(yīng)用程序的相比不同的PCL。

這就是負責解析之前的JSON的方法返回一個C#對象列表:

public async Task<List<SerieFollowersVM>> GetStatsTopSeries()
{
    using (HttpClient client = new HttpClient())
    {
        try
        {
            var response = await client.GetAsync("//api.trackseries.tv/v1/Stats/TopSeries");
            if (!response.IsSuccessStatusCode)
            {
                var error = await response.Content.ReadAsAsync<TrackSeriesApiError>();
                var message = error != null ? error.Message : "";
                throw new TrackSeriesApiException(message, response.StatusCode);
            }
            return await response.Content.ReadAsAsync<List<SerieFollowersVM>>();
        }
        catch (HttpRequestException ex)
        {
            throw new TrackSeriesApiException("", false, ex);
        }
        catch (UnsupportedMediaTypeException ex)
        {
            throw new TrackSeriesApiException("", false, ex);
        }
    }
}

HttpClient類的GetAsync() 方法執(zhí)行GET請求到URL,返回結(jié)果包含JSON響應(yīng)的字符串。這個結(jié)果存儲在響應(yīng)的Content 屬性:如果請求成功(我們使用IsSuccessStatusCode 屬性檢查這種情況),我們使用Content 屬性公開的ReadAsAsync< T >方法自動轉(zhuǎn)換為JSON導致SerieFollowersVM 對象的集合。SerieFollowersVM 無非是一個映射JSON響應(yīng)的每個屬性的類 (如namecountryruntime)到一個C#屬性:

public class SerieFollowersVM
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Followers { get; set; }
    public DateTimeOffset FirstAired { get; set; }
    public string Country { get; set; }
    public string Overview { get; set; }
    public int Runtime { get; set; }
    public string Status { get; set; }
    public string Network { get; set; }
    public DayOfWeek? AirDay { get; set; }
    public string AirTime { get; set; }
    public string ContentRating { get; set; }
    public string ImdbId { get; set; }
    public int TvdbId { get; set; }
    public string Language { get; set; }
    public ImagesSerieVM Images { get; set; }
    public ICollection<GenreVM> Genres { get; set; }
    public DateTime Added { get; set; }
    public DateTime LastUpdated { get; set; }
    public string SlugName { get; set; }
}

在GitHub的完整示例(為了方便各位讀者,小編已經(jīng)為大家整理了,請點擊這里下載)中你會發(fā)現(xiàn)很多這樣的類(映射各種被TrackSeries API返回的JSON響應(yīng))。此外,TsApiService 將實現(xiàn)另外的方法,一個用于我們想在我們的應(yīng)用程序中利用的每個API的方法。我不會詳細解釋每個方法,因為這將超出本文的范圍,你可以在GitHub上看到所有的細節(jié)。對于這篇文章的目的,你只需要知道服務(wù)只是公開了一組方法,我們可以在各種ViewModels中使用來檢索可用的電視節(jié)目的信息。

注意:默認情況下,HttpClient 類沒有提供一個ReadAsAsync< T >方法,能夠自動對JSON響應(yīng)為C#對象進行反序列化。為了獲得該擴展方法,我們需要添加Microsoft.AspNet.WebApi.Client NuGet包到便攜類庫(Portable Class Library)。為了讓它正常工作,你需要將這個包添加到解決方案的每個項目(Xamarin Forms PCL、Core PCL和所有特定于平臺的項目)。

然而,為了正確利用依賴注入(dependency injection),我們需要一個接口來描述TsApiService 類提供的操作。這就是我們的接口的樣子:

public interface ITsApiService
{
    Task<List<SerieFollowersVM>> GetStatsTopSeries();
    Task<SerieVM> GetSerieByIdAll(int id);
    Task<SerieInfoVM> GetSerieById(int id);
    Task<List<SerieSearch>> GetSeriesSearch(string name);
    Task<SerieFollowersVM> GetStatsSerieHighlighted();
}

現(xiàn)在我們有了一個服務(wù),我們可以學習(多虧Prism)我們可以如何注冊到它的依賴容器,它會自動注入在我們的ViewModels。實際上,從這個角度來看,沒有什么特別強調(diào):這與其他MVVM框架使用的方法是相同的,利用依賴注入的方法。首先,我們需要注冊我們想要在容器中使用的接口和實現(xiàn)之間的協(xié)會。在Prism的情況下,我們需要用App類的RegisterTypes()方法,通過使用Container對象和RegisterType< T, Y >()方法(其中T 是接口,Y是具體實現(xiàn)):

protected override void RegisterTypes()
{
    Container.RegisterTypeForNavigation<MainPage>();
    Container.RegisterType<ITsApiService, TsApiService>();
}

MainPage TsApiService 都在容器注冊了,我們可以在ViewModel獲得它,只需添加一個參數(shù)在公共構(gòu)造函數(shù),就像以下示例:

public class MainPageViewModel : BindableBase
{
    private readonly ITsApiService _apiService;
    public MainPageViewModel(ITsApiService apiService)
    {
        _apiService = apiService;
    }
}

MainPageViewModel 類將被加載時,我們已經(jīng)在容器注冊的ITsApiService實現(xiàn)(在我們的例子中是TsApiService 類)將自動注入構(gòu)造函數(shù)的參數(shù),允許我們以我們將在ViewModel創(chuàng)建的所有其他的方法和屬性來使用它。使用這種方法,我們將容易改變服務(wù)的實現(xiàn),以防我們需要它:它將足以改變App類的注冊類型,并且每個ViewModel將自動開始使用新的版本。

處理導航的生命周期

現(xiàn)在我們有一個服務(wù),它提供了一種方法來檢索頂級系列的列表,在ViewModel加載時我們需要調(diào)用它。我們的目標是顯示(在應(yīng)用程序的主頁)最熱門的電視節(jié)目列表。但是,我們即將面對使用MVVM模式時的一個常見的問題:檢索頂級系列列表的方法是異步的,但是隨著當前實現(xiàn),唯一我們可以執(zhí)行數(shù)據(jù)加載的地方就是ViewModel的構(gòu)造函數(shù),它不能執(zhí)行異步調(diào)用(在C#中,事實上,一個類的構(gòu)造函數(shù)不能用async關(guān)鍵字,因此,你不能用等待前綴的方法)。在non-MVVM應(yīng)用程序中,這個問題很容易解決,因為導航的生命周期方法是由每一個平臺基本提供的。Xamarin Forms毫無例外,我們可以利用(在XAML頁面類的后面的代碼)OnAppearing()OnDisappearing()方法:因為它們是事件,我們可以沒有問題地調(diào)用異步代碼。

為了解決這個問題,Prism提供一個稱為INavigationAware的接口,我們可以在ViewModels實現(xiàn)。當我們實現(xiàn)它,我們可以訪問OnNavigatedTo()OnNavigatedFrom()事件,我們可以使用它們來執(zhí)行數(shù)據(jù)加載或清理操作。這就是實現(xiàn)這個接口后我們的MainPageViewModel 的樣子:

public class MainPageViewModel : BindableBase, INavigationAware
{
    private readonly TsApiService _apiService;
    private ObservableCollection<SerieFollowersVM> _topSeries;
    public ObservableCollection<SerieFollowersVM> TopSeries
    {
        get { return _topSeries; }
        set { SetProperty(ref _topSeries, value); }
    }
    public MainPageViewModel(TsApiService apiService)
    {
        _apiService = apiService;
    }
    public void OnNavigatedFrom(NavigationParameters parameters)
    {
    }
    public async void OnNavigatedTo(NavigationParameters parameters)
    {
        var result = await _apiService.GetStatsTopSeries();
        TopSeries = new ObservableCollection<SerieFollowersVM>(result);
    }
}

正如你所看到的,現(xiàn)在我們實現(xiàn)了一個稱為OnNavigatedTo()的方法,我們可以安全地執(zhí)行異步調(diào)用和加載數(shù)據(jù)。我們調(diào)用TsApiService類的GetStatsTopSeries()方法,我們封裝結(jié)果集合到ObservableCollection屬性。這是我們要連接的屬性,通過綁定到一個ListView 控件,為了在主頁顯示電視節(jié)目列表。

出于完整性的考慮,這是MainPage的XAML的樣子:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="//xamarin.com/schemas/2014/forms"
             xmlns:x="//schemas.microsoft.com/winfx/2009/xaml"
             xmlns:prism="clr-namespace:Prism.Mvvm;assembly=Prism.Forms"
             prism:ViewModelLocator.AutowireViewModel="True"
             x:Class="InfoSeries.Views.MainPage"
             Title="Info Series">
  <ContentPage.Resources>
    <ResourceDictionary>
      <DataTemplate x:Key="TopSeriesTemplate">
        <ViewCell>
          <ViewCell.View>
            <Grid>
              <Grid.ColumnDefinitions>
                <ColumnDefinition Width="1*" />
                <ColumnDefinition Width="2*" />
              </Grid.ColumnDefinitions>
              <Image Source="{Binding Images.Poster}" Grid.Column="0" x:Name="TopImage" />
              <StackLayout Grid.Column="1" Margin="12, 0, 0, 0" VerticalOptions="Start">
                <Label Text="{Binding Name}" FontSize="18" TextColor="#58666e" FontAttributes="Bold" />
                <StackLayout Orientation="Horizontal">
                  <Label Text="Runtime: " FontSize="14" TextColor="#58666e" />
                  <Label Text="{Binding Runtime}" FontSize="14" TextColor="#98a6ad" Margin="5, 0, 0, 0" />
                </StackLayout>
                <StackLayout Orientation="Horizontal">
                  <Label Text="Air day: " FontSize="14" TextColor="#58666e" />
                  <Label Text="{Binding AirDay}" FontSize="14" TextColor="#98a6ad" Margin="5, 0, 0, 0" />
                </StackLayout>
                <StackLayout Orientation="Horizontal">
                  <Label Text="Country: " FontSize="14" TextColor="#58666e" />
                  <Label Text="{Binding Country}" FontSize="14" TextColor="#98a6ad" Margin="5, 0, 0, 0" />
                </StackLayout>
                <StackLayout Orientation="Horizontal">
                  <Label Text="Network: " FontSize="14" TextColor="#58666e" />
                  <Label Text="{Binding Network}" FontSize="14" TextColor="#98a6ad" Margin="5, 0, 0, 0" />
                </StackLayout>
              </StackLayout>
            </Grid>
          </ViewCell.View>
        </ViewCell>
      </DataTemplate>
    </ResourceDictionary>
  </ContentPage.Resources>
  <ListView ItemTemplate="{StaticResource TopSeriesTemplate}"
            ItemsSource="{Binding Path=TopSeries}" RowHeight="200"/>
</ContentPage>

如果你已經(jīng)知道Xamarin Forms(或一般的XAML),你應(yīng)該會覺得這段代碼很容易理解:頁面包含一個ListView 控件、一個描述單個電視節(jié)目的模板。我們展示節(jié)目的海報,還有一些其他信息,如標題、運行時、生產(chǎn)國家等等。因為(根據(jù)命名約定)MainPageViewModel 類已經(jīng)設(shè)置為頁面的BindingContext ,我們可以通過綁定ListViewItemsSource屬性和我們之前在ViewModel填充的TopSeries集合進行簡單地連接。

導航與參數(shù)

我們已經(jīng)看到了如何利用OnNavigatedTo()方法來執(zhí)行數(shù)據(jù)加載,但通常這種方法在另一個場景中也是有用的:檢索參數(shù)通過前一頁,這通常需要了解當前的上下文(在我們的示例中,在我們的應(yīng)用程序的詳細信息頁面,我們需要理解用戶已經(jīng)選擇的電視節(jié)目)。

Prism支持這個特性是由于一個稱為NavigationParameters的類稱,可以作為NavigationServiceNavigationAsync()方法的一個可選參數(shù)傳遞,它被自動包括作為OnNavigatedTo()OnNavigatedFrom()事件的參數(shù)。讓我們看看如何通過向我們的應(yīng)用程序添加詳細信息頁面利用這個特性,顯示選擇的節(jié)目的一些額外的信息。

第一步是同時添加一個新頁面到Views 文件夾中(稱為DetailPage.xaml)和一個新類到ViewModels文件夾中(稱為DetailPageViewModel.cs)。你需要記住,每一頁都需要在App類的容器中注冊,在OnRegisterTypes()方法內(nèi):

protected override void RegisterTypes()
{
    Container.RegisterTypeForNavigation<MainPage>();
    Container.RegisterTypeForNavigation<DetailPage>();
    Container.RegisterType<ITsApiService, TsApiService>();
}

由于命名約定,我們不需要做任何特別的操作:新頁面和新ViewModel已經(jīng)連接。現(xiàn)在我們需要通過ListView控件中所選條目到新頁面。讓我們先看看如何在主頁處理選擇。通過使用由我親愛的朋友Corrado Cavalli創(chuàng)建的庫,我們會得到一些幫助,它允許你在Xamarin Forms應(yīng)用程序?qū)崿F(xiàn)行為。可用的行為中的EventToCommand允許我們連接暴露于控件的任何事件與ViewModel中定義的命令。我們要用它來連接ListView 控件的ItemTapped 事件(當用戶點擊列表中的一個項目時會觸發(fā))與我們要在MainPageViewModel中創(chuàng)建來觸發(fā)導航到詳細頁面的命令。

你可以從NuGet安裝由Corrado創(chuàng)建的套包,它的名字叫Corcav.Behaviors。使用它你需要添加一個額外的名稱空間到MainPage的root,像下面這個示例:

<ContentPage xmlns="//xamarin.com/schemas/2014/forms"
             xmlns:x="//schemas.microsoft.com/winfx/2009/xaml"
             xmlns:prism="clr-namespace:Prism.Mvvm;assembly=Prism.Forms"
             xmlns:behaviors="clr-namespace:Corcav.Behaviors;assembly=Corcav.Behaviors"
             prism:ViewModelLocator.AutowireViewModel="True"
             x:Class="InfoSeries.Views.MainPage"
             Title="Info Series">
    ...
</ContentPage>

然后你可以申請ListView 控件的行為,就像你在普通Windows應(yīng)用程序中會做的一樣:

<ListView ItemTemplate="{StaticResource TopSeriesTemplate}"
          ItemsSource="{Binding Path=TopSeries}" RowHeight="200">
  <behaviors:Interaction.Behaviors>
    <behaviors:BehaviorCollection>
      <behaviors:EventToCommand EventName="ItemTapped" Command="{Binding GoToDetailPage}" />
    </behaviors:BehaviorCollection>
  </behaviors:Interaction.Behaviors>
</ListView>

由于這種行為,我們已經(jīng)連接了ListView 控件的ItemTapped 事件與我們要在ViewModel定義的稱為GoToDetailPage 的命令。從一個框架的角度,Prism沒有做任何不尋常的事幫助開發(fā)者實現(xiàn)命令:它只是提供了一個稱為DelegateCommand的類,這允許你定義操作來執(zhí)行調(diào)用命令和可選的條件來啟動命令。如果你有一些MVVM Light以往的經(jīng)驗,它會以RelayCommand 類那樣完全相同的方式運作。以下是我們的命令在MainPageViewModel 類的樣子:

private DelegateCommand<ItemTappedEventArgs> _goToDetailPage;
public DelegateCommand<ItemTappedEventArgs> GoToDetailPage
{
    get
    {
        if (_goToDetailPage == null)
        {
            _goToDetailPage = new DelegateCommand<ItemTappedEventArgs>(async selected =>
            {
                NavigationParameters param = new NavigationParameters();
                param.Add("show", selected.Item);
                await _navigationService.NavigateAsync("DetailPage", param);
            });
        }
        return _goToDetailPage;
    }
}

我們已經(jīng)創(chuàng)建了的命令是一個參數(shù)化命令;事實上,屬性類型是DelegateCommand< ItemTappedEventArgs >:這種方式,在方法內(nèi)部,我們獲得存儲在Item 屬性中的選中的條目。命令觸發(fā)時調(diào)用的方法展示了如何用參數(shù)的工作原理導航:首先我們創(chuàng)建一個新的NavigationParameters對象,最后,只不過是一個你可以存儲鍵/值對的字典。因此,我們只需添加一個新項,作為關(guān)鍵,關(guān)鍵字show ,作為值,選中的項的類型是SerieFollowersVM。這是與我們在App類中看到的導航的唯一的區(qū)別:其余的都是一樣的,這意味著我們調(diào)用NavigationServicetheNavigateAsync()方法,傳遞標識詳細信息頁面(DetailPage)和參數(shù)的關(guān)鍵參數(shù)。

重要事項!App類中,我們能夠自動使用NavigationService ,因為它繼承自PrismApplication 類。如果我們要在ViewModel中使用NavigationService (像在這種情況下),我們需要使用基于依賴注入(dependency injection)的傳統(tǒng)方法。NavigationService 實例已經(jīng)在Prism容器注冊,所以我們只需要添加一個INavigationService 參數(shù)到MainPageViewModel的公共構(gòu)造函數(shù):

public MainPageViewModel(TsApiService apiService, INavigationService navigationService)
{
    _apiService = apiService;
    _navigationService = navigationService;
}

既然我們已經(jīng)完成了導航到詳細頁面,我們就需要檢索DetailPageViewModel 類的參數(shù)。第一步,像我們?yōu)?strong>MainPageViewModel做的那樣,讓它從INavigationAware 接口繼承,除了BindableBase 類。通過這種方式,我們可以訪問OnNavigatedTo()事件:

public class DetailPageViewModel : BindableBase, INavigationAware
{
    private SerieFollowersVM _selectedShow;
    public SerieFollowersVM SelectedShow
    {
        get { return _selectedShow; }
        set { SetProperty(ref _selectedShow, value); }
    }
    public DetailPageViewModel()
    {
    }
    public void OnNavigatedFrom(NavigationParameters parameters)
    {
    }
    public void OnNavigatedTo(NavigationParameters parameters)
    {
        SelectedShow = parameters["show"] as SerieFollowersVM;
    }
}

前面的代碼顯示了如何處理我們從主頁收到的參數(shù):同一個我們通過的MainPageViewModel對象到作為 OnNavigatedTo()方法的參數(shù)傳遞的NavigateAsync()方法。因此,我們可以用show 鍵簡單的檢索先前存儲的項。在這種情況下,因為我們預計SerieFollowersVM類型的對象,我們可以執(zhí)行一個計算并將其存儲到稱為SelectedShow的ViewModel的屬性中。多虧了這個屬性,我們可以利用綁定到選擇顯示的各種信息連接到XAML頁面的空間。以下是DetailPage.xaml的樣子:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="//xamarin.com/schemas/2014/forms"
             xmlns:x="//schemas.microsoft.com/winfx/2009/xaml"
             xmlns:prism="clr-namespace:Prism.Mvvm;assembly=Prism.Forms"
             prism:ViewModelLocator.AutowireViewModel="True"
             Title="{Binding Path=SelectedShow.Name}"
             x:Class="InfoSeries.Views.DetailPage">
  <StackLayout>
    <Image x:Name="InfoPoster"
           Source="{Binding Path=SelectedShow.Images.Fanart}" Aspect="AspectFill" />
    <Label Text="{Binding Path=SelectedShow.Overview}" LineBreakMode="WordWrap" FontSize="13" TextColor="#98a6ad" Margin="15" />
  </StackLayout>
</ContentPage>

內(nèi)容很簡單:我們顯示show的圖片(存儲在SelectedShow.Images.Fanart屬性)和一段簡要描述(存儲在SelectedShow.Overview屬性)。

結(jié)束語

在這篇文章中,我們已經(jīng)看到在用Prism 作為MVVM框架創(chuàng)建的Xamarin Forms應(yīng)用程序中處理導航和依賴注入的一些基本概念。在下一篇文章中,我們將看到幾個高級場景,有關(guān)導航和特定于平臺的代碼的處理。你能在GitHub存儲庫找到這篇文章使用的示例應(yīng)用程序(為了方便各位讀者,小編已經(jīng)為大家整理了,請點擊這里下載)。

本文翻譯自:

 

PS: 關(guān)于移動開發(fā),這些產(chǎn)品你可以關(guān)注>>
關(guān)于移動開發(fā)的最新資訊和產(chǎn)品推薦,請<>!

標簽:移動開發(fā)導航控件Xamarin

本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn


為你推薦

  • 推薦視頻
  • 推薦活動
  • 推薦產(chǎn)品
  • 推薦文章
  • 慧都慧問
掃碼咨詢


添加微信 立即咨詢

電話咨詢

客服熱線
023-68661681

TOP
欧美肥胖老妇与子乱欲视频 | 亚洲va在线va天堂va在线 | 91色琪琪电影亚洲精品久 | 中文字幕日韩高清 | adc成人影院18以下勿进 | 日本女优在线口爆二区三区 | 欧美图片一区二区三区 | 另类激情文学一 | 亚洲日本欧美日韩中文字幕 | 青青青在线播 | 国产精品成熟老妇女 | 免费aⅴa级视 | 国产乱理论在线观看 | 国产午夜福利在线观看视频 | 激情精品一区二区在线观看 | 亚洲精品天堂在 | 国产精品无需播放器 | 最新天美传媒 | 99爱国产精品高清在线观看 | 国产日本在线观看网址 | 国产jizzjizz免费看 | 欧美日韩亚洲国产综合 | 欧洲北美日韩 | 国产精品广西柳州莫菁泽译网 | 日本高清视频免 | 91福利在线视频 | 国精产品一区二区三区有限 | 91大神电影免费观看 | 日韩a级片在线观看 | 高清有码国产一区二区 | 日韩经典欧美 | 国产亚洲精品国产福利在线观看 | 字幕在线| 在线视频一区二区三区三区不卡 | 欧美精品亚洲精品日韩专区一乛 | 亚洲大码熟女在 | 欧美日韩亚洲国产精品 | 欧美精品v日韩精品v国产 | 国产97盗摄视频一区二区三区 | 99sss高清在线视频网 | 欧美日韩精品在线视频一区 | 国产日韩欧美福利 | 精品日韩欧美一区 | 欧美性色aⅴ在线观看 | 91桃色国产精品免费在线观看 | 日韩国产欧美亚洲一区不卡 | 日本在线小视频 | 中国国产免费毛卡片 | 国产午夜福三级在线 | 欧美韩日一区二区图区 | 海角国产乱辈乱精品视频 | 中文字幕一区二区三区精品 | 99在线精品免费视频九九视 | 国产超薄肉丝袜在线观看 | 偷拍一区 | 国产精品1234| 日韩亚洲制服欧美综合 | 国产婬乱视频免费 | 欧美亚洲日韩 | 精品视频在线播放 | 国产精品亚洲玖玖玖在线 | 日韩在线免费2025 | 亚洲色精品aⅴ一区区三区 手机免费看电影 | 欧美肥妇bwbwbwbxx | 麻花影院| 欧美在线观看一区二区三区 | 欧美精品黄页在 | 日韩精品视频精品一区二区 | 精品自拍网友区在线观看 | 高清免费a级在线观看国产 熟女人妇 | 老司机影院 | 国产日本欧美高清免费区 | 最新电影免费在线观看 | 成人精品怡红院在线观看 | 二区不卡 | 69一区二三区好的精华液 | 亚洲男人的天堂在线播放 | 欧美一区二区三区精品视频在 | 九九九热在线精品免 | 欧美日韩精品一区二区免费看 | 激情欧美日韩一 | 成人精品日本亚洲电影院电影 | 精品乱子伦一区二区三区 | 91国自产精品中文字幕亚洲 | 欧美日韩综合不卡在线观看 | 国产精品欧美日韩中字一区二区 | 亚洲欧美另类在线视频 | 免费精品国产自 | 日本一二三高清 | 一区二区免费国产在线观看 | 91精品国产综合久 | 最新欧美日韩 | 午夜亚洲理 | 国产又色又爽又黄的网站在线 | 黑人巨大精品欧美视频一区 | 亚洲国产精品网站在线播放 | 欧美亚洲日韩中文字幕每日更新 | 偷窥xxxx| 欧洲日韩国产一区 | 欧美怡春院 | 国产精品免费精品自在线观看 | 欧美一区二区三区激情 | 欧美亚洲日韩一区二区三区中 | 给我免费播放片国语电影 | 48国产吹潮在线观看 | 免费人成网站免费看视频 | 9cao在线播放精品日韩 | 日韩欧美激情 | 国产在线不卡免费播放 | 精品一区二区三区四区 | 色色片色色 | 国产免费爽爽视频 | 国产女精 | 产区和二线产区区别 | 国内精品视频一区二区三区八戒 | 中文字幕一区二区三区 | 日韩性爱视频合集 | 国产高清在线观看视频 | 在线观看的免费网站 | 国产成年人视频免费 | 欧美黑人巨大性 | 成色版抖音91免费 | 欧美一区二区一 | 99亚洲男女激情在线观 | 一级国产欧美在 | h视频在线观看免费完整版 在线亚洲日韩欧美一区二区 | 亚洲精品一二三四区 | 免费影视资源 | 99亚洲国产综合一区二区 | 欧美激情第1页 | 日韩在线手机看片免费看 | 欧美第一页 | 成人国产免费软件 | 最近日本韩国观看 | 69一区二三区好的精华液 | 爱情男女免 | 亚洲中文字幕乱碼在线观看 | 中文www新版资源在线天堂√ | 久热免费视频在线观看 | 国产精品网站不卡在 | 精品蜜臀一区二区三区在线 | 国产精品成人不卡在线观看 | 老司机福| 欧美肛门| 精品亚洲成a人在线看片 | 精品日本在线免费观看 | 日韩精品免费观看视频 | 欧美日韩精品一区二区在线观看 | 国产猛男猛女超爽免费视频 | 无人区乱码一区二区三区 | 国产专区视频在线观看 | 日韩免费观看成第15集 | 精品亚洲中文字幕 | 国产日韩欧美精 | 极品白丝袜app网站 国产日产成人免费视频 | 日韩精品综合丝袜制服 | 国产丝袜护土调 | 在线欧美中文字 | 国产伦精品一区二区三区精品 | 50章厨房激情双开 | 成人性生交大片免费看一 | 日本高清中文字幕免费一区二区 | 国产乱码一区 | 一区二区三区四区免费视频 | 国产中文欧美日韩在线 | 午夜福利免费院 | 更新日韩 | 欧美性受xxxx黑人猛交 | 日韩自拍国产在线观看 | 亚洲精品在线视频 | 国偷自产一区二区三区蜜臀 | 国产乱子夫妻 | 国产在线精品手机播放 | 欧美性爱综合 | 国产一区二区视频91 | 国产乱码高清区二区三区 | 6080神| 国产一区二区三区精品尤物 | 国产线精品视频在线观看 | 精品国产福利 | 热播电视剧 | 偷拍欧美亚洲第二页 | 日本韩国一级特黄aa大片 | 三区四区五区在线播放 | 男女爽爽爽视频免费网站 | 亚洲视频精品 | 午夜免费视频在线观看 | 国产高清免费在线 | 韩国美女一区二区 | 热搜电视剧在线观 | 99热这里只有精 | 99自拍视频偷拍视频 | 国产又刺激又黄又爽又湿 | 国产黄大 | 国产欧美日韩精品高清二区综合区 | 亚洲日本欧美日韩中文字幕 | 在线观看欧美a级精品视频 欧美一级在线观 | 欧美在线视频 | 精品亚洲a| 亚洲最大综合精品 | 秘书在线观看 | 国产在线观看免 | 国产盗摄不卡 | 国产精品福利自产 | 亚洲日本aⅴ片在线观看香蕉 | 精品国产品欧美日产在线 | 国产高清精品亚洲明星换脸 | 免费人成再在线观看视频 | 欧美视频一区二区三区四区 | 日本欧美不卡一区二区三区在线 | 91传媒在线 | 久碰免费视 | 两性午夜刺激性视频2345 | 18+在线观看网站 | 国产精品91一区二区三区四区 | 国产欧美精品 | 一级一片免费播放 | 亚洲+欧美+日韩+综合aⅴ | 国内精品福利丝袜视频 | 国产乱码一卡二卡3卡四卡 国产精品视频每日更新播放 | 精品第一区视频二区 | 最近中文字幕视频高清 | 欧美亚洲国产日韩在线播放 | 国产乱之伦露脸对白xxxx | 视频一区二区三区免费观看 | 日韩欧美一区二区三区视频在线 | 美女视频黄又黄 | 色五月激情五月综合网五月天 | 欧美巨大黑人暴力xxxxx黑人 | 学生妹国产在线第一页 | 日韩a级一区二区三区四区 热播韩剧网 | 风韵犹存丰 | 国产高清日韩精品欧美激情 | 8090视频在线观看 | 国产伦精品一区二区三区视 | 日本动漫在线 | 最新国产在线视频 | 日韩伦理片免费在线观看 | 国产激情免费播放 | 国产黄三级高清在线观看播放 | www一区二区乱码www | 国产一区高清在线欧美 | 国产凸凹视频一 | 欧美亚洲丝袜制服中文 | 国产aⅴ夜夜欢一区二区三区 | 国产稀缺另类刺激对白 | 欧美特黄美女视频插 | 亚精区区一区区二在线观看 | 国产免费一区二区三区vr | 国产精品免费视频一区二区三区 | 男人添女人30分钟免费 | 国产又黄又粗又硬又爽的视 | 国产欧美日韩综合精品二区 | 日韩综合一区在线观看 | 国产原创精品国产专区 | 亚洲精品在线观看视频 | 按摩推油在线观看国产 | 国产真实伦在线观看 | 亚洲日韩中 | 国产日韩在线是高清视频 | 一个人在线视频免费观看www | 国产精品三级不卡电影 | 国产手机在线观看 | 欧美交换配乱吟粗大免费看 | 日韩丝袜视频一区二区 | 精品亚洲成a人在线 | 亚洲国产精品尤物yw在线 | 日韩a级片| 银杏影院 | 国产午夜福利a∨在线机视频 | 国产资源精品一区二区免费 | 欧美国产日韩一区二区三区综合视 | 国产不卡一区二区免费视频 | 卡4卡无卡免费2 | 欧美a级毛欧美1级a大片式放 | 国产欧美一区二区樱花在线观看 | 国产精精品免费观看 | 午夜家庭影 | 天堂8在线天堂资源 | 永久免费精品影视网站 | 老司机亚洲精品影院在线 | 欧美在线观看二区 | 性生大片免费观看网站 | 国产肥熟女一区二区三区 | 99精品国产福利免费一区二区 | 国产一级在线现免费观看 | 欧美一级电影日韩精品 | 欧美在线观看综合 | 色拍自拍亚洲综合图区 | 99精品视频观看国产金尊播放 | 欧美va免费大片 | 欧洲精品一区二区 | 女人被黑人巨大进入 | 日韩精品视频精品一区二区 | 女女在线观看舒服 | 精品欧美不卡一区 | 国产高清精品一区二区不卡 | 精品九九| 国产资源在线观 | 成全视频观看免费高清第6季 | 日韩欧美专区 | 午夜男女爽爽爽免费播放 | 免费看美女脱了全身衣服直播 | 国产精品视频每日更新 | 日韩自拍国产在线观看 | 日本一二三区不卡高清区 | 国产黄在线观看免费观看网站不卡 | 免费夜色污私人影 | 日韩一区在线欧美激情 | 日韩欧美亚洲国产一区 | 九色成人蝌蚪电影在线 | 日韩欧美国产91丝袜 | 国产老熟女精品v | 免费国语 | 精品国产一区二区三区v | 免费vip电影电视剧 国产又大又硬 | 99亚洲国产精品精华液 | 欧美变态另类刺激 | 国产日韩欧美视频网址 | 国产91精品在线播放 | 日本激情夜里视频在线观看 | 日韩欧洲区精品一区二区 | 欧美精品亚洲精品日韩专区 | 亚洲影视网 | 欧美日产国产草草 | 欧美黑人巨大激情视频在线观看 | 暴雨入室侵犯进出肉体 | 白丝视频 | 性直播视频在线观看免费 | 国产精品一区二区三区免费视频 | 欧美v日韩v亚洲v最新在线观看 | 中文字幕资源网在线观看免费 | 国产在线精品福利91啪 | 日本乱码伦电影 | 成人3d精品动漫在线播放 | 国产日韩在线欧美视频 | 日本特黄特黄aaaaa大片 | 日本一区二区三区精品视频 | 国产人碰人摸人爱视频 | 国产精品免费入口视频 | 天堂va欧美ⅴa亚洲va一国产 | 亚洲国产综合另类视频在线观看 | 国产99 | 精品国产乱伦一区二区三区 | 日本一夲道dvd在线 国产精品不卡免费视频 | 中国一级大黄 | 亚洲综合国产一区二区三区 | 日本中文字幕在线免费观看视 | 欧美激情国产一区在线不卡 | 中文字幕不卡 | 视频一区二区亚洲欧美 | 另类专区亚洲97在线视频 | 国产在亚洲线视频观看。 | 自拍偷自拍亚洲精品播放 | 国产亚洲精品a在线观看app | 国产日产中文在线观看 | 欧美1区2区3区 | 五月丁香婷婷激情一区二区 | 91精品污 | 嫖妓国产在线观看 | 凹凸国产熟| 欧美日韩精品一区二区三区视 | h漫全彩纯 | 日本精品影视国产 | 野花论坛社区 | 91精品亚洲欧美日韩在线 | 中国在线观看免费国语版 | 国产精品一区高清在线观 | 日韩一卡2卡3 | 一区二区高清视频 | 无人区大片中文字幕在线 | 国产原创精品国产专区 | 国产乱轮精品一区 | 日韩在线观看视频 | 电影在线观看高清完整版 | 性猛交╳xxx乱大交 亚洲va在线观看 | 区二区导航 | 国产精品一区二区三区大 | 欧美三级蜜桃2在线观看 | 久夜色精品国产一区二区三区 | 99re在线视| 成人羞羞视频 | 夜色在线国产精 | 欧美精产国品一二三产品区别 | 国产欧美日韩高清在线不卡 | 色综合天天综合网国产国产人 | 日韩性爱在线观看 | 欧美伊人网91 | 日韩男女性生活视频在线观看 | 亚洲精品日韩在线观看高清不卡 | 日韩精品免费在线观看 | 日日噜噜夜夜狠狠视频无 | 亚洲精品中文字幕不卡 | 欧美日韩专区国产精品 | 国内精品视频成人一区 | 欧美日韩国产一区二区三区不卡 | 日本一区二区在线播放 | 国产精品精品国内自产拍 | 国产不卡视频在线观看 | 日本欧美一区二区三区免费不卡 | 日韩在线中文字幕一区 | 国产初高中系列视频在线 | www.五月天激情 | 在线观看国产高清免费不卡黄 | 中文字幕精品一二三四五六七八 | 国产在线日韩欧美 | 国产日韩aⅴ在线播放 | 免费电影网 | 欧美制服丝袜在线 | 皮皮在线精品亚洲 | 中文字幕精品 | 亚洲欧美精品精品aⅴ | 日韩怡红院亚洲精品二区 | 亚洲欧美日韩专区一区二区三区 | 国产又爽又色又刺激视频含羞草 | 欧美日韩精品系列一区二区三区 | 91精彩视频在线观看 | 在线看片国产日韩欧美亚洲 | 91精品国产自产91精品 | 国产丝袜| 91看片婬黄大片91桃色 | 亚洲欧美另类在线区 | 国产精品电影在线观看 | 亚洲区日韩精品中文字暮 | 国产婷婷一区二区在线观看 | 91精品视品在线播放 | 91桃色成人免费观看 | 老司机网| 男人j放进女人p全黄在线 | 成人va在线一区二区三区四区 | 欧美成a高清在线观看www | 日韩激情视频网站 | 最新md传| 国产网站1区2区 | 91最新亚洲精品中文字幕 | 欧美中文综合在线视频 | 国产凸凹视频熟女a | 国产自偷酒店在线观看 | 久章草在线视频 | 韩国一级真人片a级免观看 国产免费一级视频在线 | www亚洲色大成网络.com | 福利区在线观看 | 欧美日韩国产激情一区 | 不卡一区二区三区在线 | 天美传媒果冻传媒国产电影 | 电影免费在线观看中文字幕 | 日韩中文视| 成全影院电视剧在线观看 | 免费手机在线看片 | 国产色精品vr一区二区 | 成人永久免费 | 97色伦午夜免费公开视频 | 国产高清免费在线播放 | 国产一区欧美日韩3d | 飘雪免费手机全集在线观看 | 欧美一级在线观 | 另类癖好 | 国产精品1024永久免费视频 | 日本精品精品精品线视频 | 欧美一级淫片 | 国产激情一区二区三区在线hd | 日韩一级品 | 欧美日韩免费一区二区在线观看 | 成年女人 | 国产精品亚洲а∨天堂免下 | 国产资源在线观看免费高清 | 国产太嫩了在线观看 | 国产欧美日韩电影在线观看 | 欧美韩国电影免费在线观看 | 91.精品国产 | 国产欧美在线人成 | 国产精品亚洲综合视频 | 手机免费在线观看日韩电影 | 国家人类遗传资源共享服务平台 | 综合久青草视频 | 高清午夜福利电影在线 | 亚洲日韩国产一 | 真实国产日韩欧美全部综合视频 | 国产精品一区二区播放在线 | 日韩欧美国产一区免费 | 亚洲高清免费观看 | 美女视频免费观看网站黄 | 精品aⅴ老司机天堂网站 | 国产乱码在线精品可播放 | 欧亚一卡二卡3卡四卡精品 日本一区二区 | 国产精品一区欧美日韩制服 | 欧美午夜片在线观看 | 欧美整片aⅴ免费 | 91探花在线观看 | 91tv在线播放 | 中文字幕在线永久 | 亚洲精品伊人 | 日韩国产精品一区二 | 日本在线天堂 | 国产亚洲观看日韩 | 欧美、另类亚洲日本一区二 | 国产亚洲日韩欧美另类第八页 | 国产高清久 | 成人动视频国产欧美精品 | 成人免费电影 | 好看的电视剧免费 | 人人澡c片人人大片视频 | 亚洲国内自拍欧美 | 国产福利萌白 | 亚洲激精日韩激情欧美激 | 老少配videoshd乱配 | 韩国午夜三级理论 | 污污污污污www网站免费观看 | 精品国产黄页网站在线观看 | 伦理、限制级电影手机在线观看 | 免费成年人影片 | 欧美+日韩+中文字幕 | 国产精品日韩精品在线观看 | 国产高清看片日韩 | 亚洲精品欧美中文字幕 | 成人三级视频 | 护士张开腿 | 欧美黑吊粗大猛烈18p | 多人性战交疯狂派对 | 欧洲在线观看视频高 | 国产精选在线观看 | 97在线视频免费观看视频免费 | 国产精品1区在线播放 | 精品自拍网友区在线观看 | 日本一区二区三区免费在线观看 | 日韩中文高清在线专区 | 日本一本之道之视频在线不卡 | a一级视频在线免 | 狂处让老二爽18p | 亚洲人成日韩中文字幕不卡 | 免费高清电影电 | 欧美日本综合一区二区 | 国产日韩欧美在线观看一区二区 | 国产精品一区一区 | 加勒比综合精品 | 精品国内一区二区三区蜜桃 | 国产高清免费观看视频 | 国色天香社区视频手机免费 | 日韩aⅴ免费精品一区二区三区 | 成人一区在线观看 | 日韩色婷| 91精品啪在线观看国产老人令品 | 欧美精品专区高清在线爱美 | 99re国产精品视频 | 日韩在线一区二区三区观看 | 女同在线电 | 日韩在线免 | 911中文字幕免费高清观看 | 亚洲成在人线影视天堂网 | 最新短剧电视剧 | 亚洲网站视频在线观看 | xyx性爽欧美观看 | 国产熟女一区二区三区十视频 | 最近中文字幕完整版2025一页 | 精品视频在线播放一区二区三区 | 国产素人自拍 | 麻花豆传媒mv在线观 | 最近在线观看免费完整版高清电影 | 亚洲欧美综合精品成 | 国产一区二区不卡老阿姨 | 日本精品一区二区三区高清 | 秋霞影院在线观看 | 欧美亚洲日本国产综合网 | 高清一级做a爱过程不卡视频 | 18黄人成网站在线观看 | 最新国产ts人妖系列视频 | 大色佬视频在线 | 97超级免费 | 欧美变态口味重另类在线视频 | 日韩成人精品在线 | 欧美日韩中文国产一区 | 视频一区二区三区在线看 | 亚洲国产高清在线不卡 | 国产精品免费视频一区二区 | 99热这里只有精品动漫国产 | 亚洲国产一区二区中文字幕 | 亚洲日本一线产区和二线产 | 免费va人成 | 欧美一性一乱 | 国产妇女视频免费 | 亚洲精品国产第一区二区小说 | 欧美性十八变态另类 | 国内自拍亚洲精选在线观看 | 麻花传媒68xxx在线观看 | 日本中文字幕一区二区高清 | 国产精品一区二区20p发布 | 国产真实乱对白精彩 | 欧美v曰韩v亚州v国产 | 337p欧美顶级日本大片 | 美腿丝袜在线播放 | 国产午夜在线免费 | 免费vip电影电视剧 国产又大又硬 | 欧洲精品一区二区三区在线观看 | 九九视频免费精品视频免费 | 韩国福利影视一区二区三区 | 国产性爱| 91福利精品国产自产在线 | 亚洲日本欧美中文幕 | 大香伊蕉在人线国产最新75 | 视频区国产图片区小说区 | 国产自拍 | 天堂va视频一区二区 | 一区二区三区亚洲高清 | 国产天堂在线观看 | 女厕所撒尿视频免费 | 亚洲色精品aⅴ一区区三区 手机免费看电影 | 日韩精品人成在线播放 | 精品熟女视频一区二区三区国产 | 亚洲欧美日韩亚 | 天堂mv在线mv免费mv香蕉 | 亚洲综合第| 国产日韩ai换脸在线第一页 | 国产在线精品国自产拍影院同性 | 亚洲中文字幕乱码一区 | 观看一区二区视频 | 国产精品性 | 午夜成人免费y在线观看 | 亚洲国产精品成人va在线观看 | 不卡在线观看 | 国产片a国产片免费看视频 尤物网红麻酥酥 | 日本免费一级手机看片一区二区 | 亚洲伦理一区二 | 27pao国产成视频播放 | 国产欧美日韩制服在线 | 国产精华液和欧美的精华液 | 日韩a级一片在线观看 | 中文字幕v人 | 午夜成人福利电影 | 国语自产精品视频在线完整版 | 亚洲成在人线中文字幕 | 野花日本大全免费观看中文7 | 国产欧美精品日韩 | 欧美老少配孩交 | 欧美日本一区二区三区在线 | 欧美视频一区二区三区在线观看 | 久别的草原在线影院播放免费 | 91自拍偷拍视频 | 国产手机在线观看 | 午夜在线观看亚 | 午夜三级中文在线观看 | 亚洲天堂视频在线免费观看 | 精品视频在线播放 | 日本理论片和搜子同居的日子电 | 疯狂的激情欧美 | 久9视频这里只有精品试看 伊人成色综 | aa免费视频观看网站 | 国产精品乱码一区二区三区 | 不卡视频在线播放 | 日本高清激情乱一区二区三区 | 欧美暴力深喉囗交 | 国产欧美日韩第一页 | 国产对白精品刺激一区二区 | 中国老熟女重囗味hdxx | 国产亚洲日韩欧美另类第八页 | 国产对白老熟女正在播放 | 黑人中文字幕在线 | 国内自拍亚洲精选在线观看 | 国产91精品高清一区二区三区 | 国产精品欧美亚洲韩国日 | 国产普通话对白在线观看视频 | 国产午夜在线观看 | 成人精品视频 | 91成人精品一区二区三区四区 | 亚洲精品综合在线发布 | 另类尿喷潮videofree | 国产男女猛烈视频在线观看 | 欧美巨大巨粗黑人性aaaaaa | 337p西西人体大胆瓣开下部 | 午夜亚洲国产理论片二 | 大陆精大陆国产国语精品 | 区二区三区 | 日韩午夜在线高清成人影片观看 | 成人影院在线免费观看 | 亚洲性影院在线看 | 国产在线不卡精品网站互動交 | 九色91popny蝌蚪 | 欧美精品亚洲日韩aⅴ | 在线观看成人年视频免费 | 99视频在线观看 | 国产草莓 | 国产大片免费线上观 | 日本强不| 99精产国品一二三产区区别 | 免费草莓视频app在线下载 | 亚洲日本欧美综合在线一 | 伊人色综合一区二区三区 | 制服丝袜在线手机国产 | 日韩精品男人的天堂 | 欧美日产国产精品视频免费 | 黄页网址大全免费观看 | 国产精品视频害羞初高中 | 国产一级一级农村人一片 | 国产精品日韩精品日本精品 | 日韩精品人成在线播 | 成人三级电| 免费国产亚洲精品在线视频 | 国产精品制 | 日韩高清在线精品观看网站免 | 日本欧美一区二区三区片 | 男人添女人30分钟免费 | www.丁香花小说网 | 日韩欧美国产免费看清风阁 | 日本午夜福利剧场 | 亚洲人免 | 91高清视频| 在线日韩欧美国 | 国产亚洲午夜高清国产拍精品 | 国产精品自产在线观看免费 | 国产99视频精| igao激情视频 | 国产免费破外女真实出血视 | 里啪啦影院大全 | 99在线视频免费观看 | 99爱在线观看精品视频 | 日韩a∨精品一区二区三区 国产欧美亚洲一区二区三区四区 | 免费国产午夜激情片 | 俺去啦俺来也五月天 | 日本中文字幕在线视频一区 | 91久国产在线观看电影 | 在线成人精品国产区免费 | 丰满岳乱妇 | 亚洲一区二区偷拍第一页 | 亚洲精品国产高清 | 国产中文每日更新在线观看 | 青青草原亚洲之五月婷 | 精品国产污污免费网站入口在 | 一区二区三区在线视频观看 | 国产一区二区免费播放 | 一本大道香蕉中文在线视频 | 3751性欧美视频在线播放 | 99在线精 | 免费国产污网站在线观看 | 高圆圆又紧又大又湿又爽 | 成年男人午夜片免费观看 | 欧美国产剧情一区二区 | 欧美日韩精品一区二区在线播放 | 在线看一区二区中 | 国产免费午夜福利在线播放92 | 国产又粗又猛又爽又黄 | 日韩精品午夜视频一区二区三区 | 最新的国 | 天天天天香蕉线视频国产 | 美女禁区a级全片免费观看 黑人巨大跨种族video | 真人性生交免费视频 | 在线一区二区三区中文字幕 | 香蕉国产线看观看伊 | 综合五月天堂 | 丰满年轻 | 一区二区三区日本在线视频免费 | 亚洲中文字幕a∨在线 | a级高清观看视频在线看 | 国产厨房一区二区三区 | 日韩成人午夜影院 | 日本一卡二卡三 | 国产精品亚洲欧美云霸高清 | 果冻传媒视频在线 | 日韩丝袜亚洲国产欧美一区 | 亚洲国产中文字幕在线观看 | 国产精品毛多多 | 91极品反差婊在线观看 | 视频一区二区亚洲欧美 | 日本爽爽爽爽爽爽免费视频 | 国产精品福利小 | 免费国产人做人视频在线观看 | 日韩一区二区三区在线精品 | 亚洲天堂一区二区在线观看 | 国产精品区一区二区三 | 国产精品自在自线国产午夜 | 热门电视剧免费在线观看 | 国产中文字幕玖玖 | 综合另类小说欧美另类图片 | 亚洲aⅴ精品一区二区三区 亚洲欧美一区 | 美女国产在线观看免费观看 | 国产精品1024cc | 操操综合| 九九热思思精品视频 | 欧美性a视频 | 精品综合国产高清 | 国产尤物aⅴ尤物在线观看 二区不卡 | 日韩高清在线观看 | 91精品国产乱 | 国产高清乱码一区二 | 欧美理论片在线观看一区二区 | 国产在线观看 | 精品国精品国产自在久国产87 | 伦理片手机在线观看 | 欧美国产精品一级二级三级 | 日韩欧美国产精品 | 国产精品日本一区二区在线 | 国产高清一级做a爱在线观看 | 亚洲网站在线观看人成 | 成人午夜视| 岛国一区二区三区视频 | 亚洲+日本+欧洲+国产 | 国产亚洲欧美日韩综合在线 | 国产精品理伦片 | 国产一级欧美一区二区 | 69视频在线观看 | 午夜福利影院 |