日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

C# WPF MVVM开发框架Caliburn.Micro 关于Conventions⑧

發(fā)布時間:2023/12/4 74 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C# WPF MVVM开发框架Caliburn.Micro 关于Conventions⑧ 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

01

關(guān)于Conventions

Caliburn.Micro的一個主要特性是,它能夠通過一系列約定消除對鍋爐銘牌代碼的需求。有些人喜歡習(xí)俗,有些人討厭習(xí)俗。這就是為什么CM的約定是完全可定制的,如果不需要,甚至可以完全關(guān)閉。如果您要使用約定,并且由于它們在默認(rèn)情況下處于啟用狀態(tài),那么最好了解這些約定是什么以及它們是如何工作的。這就是本文的主題。

View Resolution (ViewModel-First)

視圖分辨率(視圖模型優(yōu)先)

基礎(chǔ)

使用CM時可能遇到的第一個約定與視圖分辨率有關(guān)。此約定影響應(yīng)用程序的任何ViewModel優(yōu)先區(qū)域。在ViewModel First中,我們有一個需要渲染到屏幕上的現(xiàn)有ViewModel。為此,CM使用一個簡單的命名模式來查找UserControl1,它應(yīng)該綁定到ViewModel并顯示它。那么,這種模式是什么?讓我們看一下ViewLocator.LocateForModelType以了解:

public static Func<Type, DependencyObject, object, UIElement> LocateForModelType = (modelType, displayLocation, context) =>{var viewTypeName = modelType.FullName.Replace("Model", string.Empty);if(context != null){viewTypeName = viewTypeName.Remove(viewTypeName.Length - 4, 4);viewTypeName = viewTypeName + "." + context;}var viewType = (from assmebly in AssemblySource.Instancefrom type in assmebly.GetExportedTypes()where type.FullName == viewTypeNameselect type).FirstOrDefault();return viewType == null? new TextBlock { Text = string.Format("{0} not found.", viewTypeName) }: GetOrCreateViewType(viewType); };

讓我們先忽略“context”變量。為了導(dǎo)出視圖,我們假設(shè)您在vm的命名中使用了文本“ViewModel”,因此我們只需通過刪除單詞“Model”將其更改為“view”。這具有更改類型名稱和名稱空間的效果。因此ViewModels.CustomerViewModel將成為Views.CustomerView。或者,如果您是按功能組織應(yīng)用程序:CustomerManagement.CustomerServiceWModel變?yōu)镃ustomerManagement.CustomerView。希望這是非常直截了當(dāng)?shù)摹+@得名稱后,我們將搜索具有該名稱的類型。我們將通過AssemblySource.Instance搜索您向CM公開的任何程序集。2如果我們找到類型,我們將創(chuàng)建一個實例(如果已注冊,則從IoC容器中獲取一個實例),并將其返回給調(diào)用方。如果找不到類型,我們將生成一個帶有適當(dāng)“not found”消息的視圖。

現(xiàn)在,回到“上下文”值。這就是CM如何支持同一ViewModel上的多個視圖。如果提供了上下文(通常是字符串或枚舉),我們將根據(jù)該值對名稱進(jìn)行進(jìn)一步轉(zhuǎn)換。通過從末尾刪除單詞“View”并附加上下文,此轉(zhuǎn)換有效地假設(shè)您擁有用于不同視圖的文件夾(命名空間)。因此,給定“Master”上下文,我們的ViewModels.CustomerViewModel將變成Views.Customer.Master。

其他需要知道的事情

除了實例化視圖外,GetOrCreateViewType還將在視圖上調(diào)用InitializeComponent(如果存在)。這意味著,對于由ViewLocator創(chuàng)建的視圖,根本不需要代碼落后。如果這讓您感到高興,您可以刪除它們:)您還應(yīng)該知道ViewLocator.LocateForModelType從不直接調(diào)用。它總是通過ViewLocator.LocateForModel間接調(diào)用。LocateForModel獲取ViewModel的實例并返回視圖的實例。LocateForModel的功能之一是檢查ViewModel是否實現(xiàn)了IViewAware。如果是這樣,它將調(diào)用它的GetView方法來查看您是否有緩存的視圖,或者是否顯式地處理視圖創(chuàng)建。如果不是,則將ViewModel的類型傳遞給LocateForModelType。

定制

開箱即用的約定非常簡單,它基于我們在現(xiàn)實世界中使用過和看到其他人使用過的許多模式。然而,您絕不局限于這些簡單的模式。您會注意到上面討論的所有方法都是作為Funcs實現(xiàn)的,而不是實際的方法。這意味著您可以通過簡單地用自己的實現(xiàn)替換它們來定制它們。如果只想添加到現(xiàn)有行為,只需將現(xiàn)有Func存儲在變量中,創(chuàng)建一個調(diào)用舊函數(shù)的新Func,然后將新Func分配給ViewLocator.LocateForModelType。

v1.1的更改v1.1中我們完全更改了LocateForModelType函數(shù)的實現(xiàn)。現(xiàn)在,我們使用新的NameTransformer類的一個實例以及預(yù)先配置的基于RexEx的規(guī)則來進(jìn)行名稱映射。我們支持與以前相同的現(xiàn)成約定,但現(xiàn)在您可以更輕松地添加自定義轉(zhuǎn)換規(guī)則。

框架使用

框架使用ViewLocator的地方有三個;您可以期望應(yīng)用視圖位置約定的三個位置。第一名是Bootstrapper。在這里,您的根ViewModel被傳遞給定位器,以確定應(yīng)用程序的shell應(yīng)該如何呈現(xiàn)。在Silverlight中,這將導(dǎo)致設(shè)置或您的RootVisual。在WPF中,這將創(chuàng)建主窗口。事實上,在WPF中,引導(dǎo)程序?qū)⒋宋薪oWindowManager,這使我想到……ViewLocator使用的第二個位置是WindowManager,它調(diào)用它來確定任何對話框ViewModels應(yīng)如何呈現(xiàn)。利用這些約定的第三個也是最后一個地方是View.Model attached屬性。每當(dāng)您使用UIElement上的View.Model attached屬性進(jìn)行ViewModel首次合成渲染時,都會調(diào)用定位器以查看合成的ViewModel應(yīng)如何在UI中的該位置進(jìn)行渲染。您可以在UI中顯式使用View.Model attached屬性(可以選擇將其與View.Context attached屬性組合以進(jìn)行上下文呈現(xiàn)),也可以按約定添加該屬性,從而實現(xiàn)視圖的常規(guī)組合。請參閱下面關(guān)于屬性綁定約定的部分。

ViewModel Resolution (View-First)

視圖模型分辨率(視圖優(yōu)先)

基礎(chǔ)

盡管Caliburn.Micro更喜歡ViewModel-First開發(fā),但有時您可能希望采用視圖優(yōu)先的方法,尤其是在使用WP7時。如果從視圖開始,則可能需要解析ViewModel。我們在這個場景中使用了與視圖位置類似的命名約定。這由ViewModelLocator.LocateForViewType處理。當(dāng)使用視圖位置時,我們將“ViewModel”的實例更改為“View”,而使用ViewModel位置時,我們將“View”更改為“ViewModel”。另一個有趣的區(qū)別在于我們?nèi)绾潍@得ViewModel本身的實例。由于ViewModels可能由接口或具體類注冊,因此我們也嘗試生成可能的接口名稱。如果我們找到匹配項,我們將從IoC容器中解析它。

其他需要知道的事情

實際上,框架從未直接調(diào)用ViewModelLocator.LocateForViewType。它由ViewModelLocator.LocateForView在內(nèi)部調(diào)用。LocateForView首先檢查視圖實例的DataContext,查看您以前是否緩存或自定義創(chuàng)建了ViewModel。如果DataContext為null,則只有在該情況下才會調(diào)用LocateForViewType。最后要注意的是,自動初始化組件調(diào)用在性質(zhì)上不受view first支持。

定制

在v1.1中,我們完全改變了LocateForViewType函數(shù)的實現(xiàn)。現(xiàn)在,我們使用新的NameTransformer類的一個實例以及預(yù)先配置的基于RexEx的規(guī)則來進(jìn)行名稱映射。我們支持與以前相同的現(xiàn)成約定,但現(xiàn)在您可以更輕松地添加自定義轉(zhuǎn)換規(guī)則。

框架使用

ViewModelLocator僅由框架的WP7版本使用。FrameAdapter使用它,它確保每次導(dǎo)航到頁面時,都提供了正確的ViewModel。如果需要的話,它可以很容易地適應(yīng)Silverlight導(dǎo)航框架的使用。

ViewModelBinder

基礎(chǔ)

當(dāng)我們將視圖和ViewModel綁定在一起時,無論是使用ViewModel優(yōu)先還是視圖優(yōu)先方法,都會調(diào)用ViewModelBinder.bind方法。此方法將視圖的Action.Target設(shè)置為ViewModel,并相應(yīng)地將DataContext設(shè)置為相同的值。4它還檢查ViewModel是否實現(xiàn)了IViewAware,如果實現(xiàn)了,則將視圖傳遞給ViewModel。如果更適合您的場景,這將允許更具監(jiān)督性的控制器樣式設(shè)計。ViewModelBinder所做的最后一件重要事情是確定是否需要創(chuàng)建任何常規(guī)屬性綁定或操作。為此,它在UI中搜索綁定/操作的候選元素列表,并將其與ViewModel的屬性和方法進(jìn)行比較。當(dāng)找到匹配項時,它將代表您創(chuàng)建綁定或操作。

其他需要知道的事情

在所有平臺上,約定都不能應(yīng)用于DataTemplate的內(nèi)容。這是Xaml模板系統(tǒng)的當(dāng)前限制。我已經(jīng)要求微軟解決這個問題,但我懷疑他們是否會回應(yīng)。因此,為了將綁定和操作約定應(yīng)用于DataTemplate,必須將Bind.Model=“{Binding}”附加屬性添加到DataTemplate內(nèi)的根元素。這為Caliburn.Micro提供了必要的鉤子,以便在每次從DataTemplate實例化UI時應(yīng)用其約定。

在WP7平臺上,如果要綁定的視圖是PhoneApplicationPage,則此服務(wù)負(fù)責(zé)將操作連接到ApplicationBar的按鈕和菜單。有關(guān)這方面的更多信息,請參閱WP7特定文檔。

定制

如果您決定不喜歡ViewModelBinder的行為(更多細(xì)節(jié)見下文),它將遵循與上述框架服務(wù)相同的模式。它有幾個函數(shù),您可以用自己的實現(xiàn)來替換,例如Bind、BindActions和BindProperties。不過,定制最重要的方面可能是能夠關(guān)閉活頁夾的約定功能。為此,請將ViewModelBinder.ApplyConventionsByDefault設(shè)置為false。如果要逐個視圖啟用它,可以在視圖中將view.ApplyConventions attached屬性設(shè)置為true。此附加屬性以兩種方式工作。因此,如果默認(rèn)情況下啟用了約定,但需要逐個視圖將其禁用,則只需將此屬性設(shè)置為false。

框架使用

ViewModelBinder用于Caliburn.Micro內(nèi)部的三個位置。第一個位置是View.Model附加屬性的實現(xiàn)內(nèi)部。此屬性獲取您的ViewModel,使用ViewLocator定位視圖,然后將它們一起傳遞到ViewModelBinder。綁定完成后,視圖被注入到定義屬性的元素中。這是ViewModel的第一個使用模式。使用ViewModelBinder的第二個位置是Bind.Model attached屬性的實現(xiàn)內(nèi)部。此屬性獲取ViewModel并將其與定義該屬性的元素一起傳遞到ViewModelBinder。換言之,這是視圖優(yōu)先,因為您已經(jīng)在Xaml中內(nèi)聯(lián)實例化了視圖,然后只是針對ViewModel調(diào)用綁定。使用ViewModelBinder的最后一個位置是框架的WP7版本。在FrameAdapter內(nèi)部,當(dāng)頁面被導(dǎo)航到時,首先使用ViewModelLocator獲取該頁面的ViewModel。然后,使用ViewModelBinder將ViewModel連接到頁面。

Element Location

基礎(chǔ)

現(xiàn)在,您已經(jīng)了解了ViewModelBinder的基本角色以及框架使用它的位置,我想深入了解它如何應(yīng)用約定的細(xì)節(jié)。如上所述,ViewModelBinder“在UI中搜索綁定/操作的候選元素列表,并將其與ViewModel的屬性和方法進(jìn)行比較。”了解其工作原理的第一步是了解框架如何確定UI中哪些元素可能是約定的候選元素。它通過在名為GetNamedElementsInScope的靜態(tài)ExtensionMethods類上使用func來實現(xiàn)這一點(diǎn)。5基本上,該方法有兩個功能。首先,它確定了要在其中搜索元素的范圍。這意味著它將遍歷樹,直到找到合適的根節(jié)點(diǎn),例如窗口、UserControl或沒有父節(jié)點(diǎn)的元素(表示我們在DataTemplate中)。一旦定義了作用域的“外部”邊界,它就開始了第二項任務(wù):定位該作用域中具有名稱的所有元素。搜索會小心地遵守“內(nèi)部”范圍邊界,不遍歷子用戶控件的內(nèi)部。然后,ViewModelBinder使用此函數(shù)返回的元素應(yīng)用約定。

其他需要知道的事情

GetNamedElementsInScope方法可以完成一些開箱即用的限制。它只能搜索可視化樹ContentControl.Content和ItemsControl.Items。在WPF中,它還搜索HeaderContentControl.Header和HeaderEditsControl.Header。這意味著,當(dāng)嘗試應(yīng)用約定時,將找不到上下文菜單、工具提示或任何其他不在可視化樹中或這些特殊位置之一的內(nèi)容。

定制

您可能不會遇到與上述元素位置限制相關(guān)的問題。但是如果您這樣做了,您可以輕松地用自己的實現(xiàn)替換默認(rèn)實現(xiàn)。您可能會選擇使用以下一種有趣的技術(shù):如果視圖是用戶控件或窗口,則不必遍歷元素樹,而是使用一些反射來發(fā)現(xiàn)從FrameworkElement繼承的所有私有字段。我們知道,在編譯Xaml文件時,會為所有具有x:Name的文件創(chuàng)建一個私有字段。利用這個優(yōu)勢。不過,您必須回到DataTemplateUI的現(xiàn)有實現(xiàn)。我不提供這種開箱即用的實現(xiàn),因為它不能保證在Silverlight中成功。原因是Silverlight不允許您獲取私有字段的值,除非調(diào)用代碼是定義字段的代碼。但是,如果所有視圖都是在單個程序集中定義的,那么可以通過在與視圖相同的程序集中創(chuàng)建新實現(xiàn)來輕松地進(jìn)行我剛才描述的修改。此外,如果您有一個多程序集項目,您可以編寫一點(diǎn)管道代碼,讓GetNamedElementsInScope funct找到可以實際執(zhí)行反射的特定于程序集的實現(xiàn)。

框架使用

我已經(jīng)提到,當(dāng)ViewModelBinder嘗試按約定綁定屬性或方法時,會出現(xiàn)元素位置。但是,還有第二個地方使用此功能:解析器。每當(dāng)您使用Message.Attach并且您的操作包含參數(shù)時,消息解析器必須找到您用作參數(shù)輸入的元素。看起來我們可以只做一個簡單的FindName,但是FindName是區(qū)分大小寫的。因此,我們必須使用自定義實現(xiàn),它執(zhí)行不區(qū)分大小寫的搜索。這確保了在兩個地方使用相同的綁定語義。

Action Matching

基礎(chǔ)

在找到約定綁定的元素后,ViewModelBinder要做的下一件事是檢查它們是否與ViewModel上的方法匹配。它通過使用一些反射來獲得ViewModel的公共方法來實現(xiàn)這一點(diǎn)。然后它在它們上面循環(huán),尋找與元素匹配的不區(qū)分大小寫的名稱。如果找到匹配項,并且元素上沒有任何預(yù)先存在的Interaction.Triggers,則會附加一個操作。檢查預(yù)先存在的觸發(fā)器用于防止約定系統(tǒng)創(chuàng)建與開發(fā)人員在標(biāo)記中明確聲明的操作重復(fù)的操作。為了安全起見,如果您在匹配的元素上聲明了任何觸發(fā)器,那么將跳過它。

其他需要知道的事情

常規(guī)操作是通過在元素上設(shè)置Message.Attach attached屬性創(chuàng)建的。讓我們看看這是如何建立起來的:

var message = method.Name; var parameters = method.GetParameters();if(parameters.Length > 0) {message += "(";foreach(var parameter in parameters){var paramName = parameter.Name;var specialValue = "$" + paramName.ToLower();if(MessageBinder.SpecialValues.Contains(specialValue))paramName = specialValue;message += paramName + ",";}message = message.Remove(message.Length - 1, 1);message += ")"; }Log.Info("Added convention action for {0} as {1}.", method.Name, message); Message.SetAttach(foundControl, message);

如您所見,我們構(gòu)建了一個表示消息的字符串。此字符串僅包含消息的操作部分;未聲明任何事件。您還可以看到,它循環(huán)遍歷方法的參數(shù),以便將它們包含在操作中。如果參數(shù)名與一個特殊的參數(shù)值相同,我們確保將“$”附加到它,以便解析器能夠正確識別它,之后調(diào)用操作時MessageBinder能夠正確識別它。

設(shè)置Message.Attach屬性后,解析器立即啟動,將字符串消息轉(zhuǎn)換為某種類型的TriggerBase,其中包含關(guān)聯(lián)的ActionMessage。因為我們沒有將事件聲明為消息的一部分,所以解析器會查找消息所附加到的元素類型的默認(rèn)觸發(fā)器。例如,如果消息被附加到一個按鈕,那么我們將得到一個EventTrigger,其事件設(shè)置為Click。此信息通過ConventionManager配置,具有合理的現(xiàn)成默認(rèn)值。請參閱下面有關(guān)ConventionManager和ElementConventions的部分以了解更多信息。ElementConvention用于創(chuàng)建觸發(fā)器,然后解析器將操作信息轉(zhuǎn)換為ActionMessage。這兩個元素連接在一起,然后添加到Interaction.Triggers元素的集合中。

定制

ViewModelBinder.BindActions是一個Func,因此如果需要,可以完全替換。通過ConventionManager添加或更改ElementConventions也會影響操作的組合方式。下面將詳細(xì)介紹。

框架使用

BindActions僅由ViewModelBinder使用。

Property Matching

基礎(chǔ)

一旦動作綁定完成,我們就轉(zhuǎn)到屬性綁定。它遵循類似的過程,在命名元素中循環(huán),并在屬性上查找不區(qū)分大小寫的名稱匹配項。一旦找到匹配項,我們就可以從ConventionManager獲取ElementConventions,這樣我們就可以確定該元素上的數(shù)據(jù)綁定方式。ElementConvention定義了一個ApplyBinding Func,它接受視圖模型類型、屬性路徑、屬性信息、元素實例和約定本身。此Func負(fù)責(zé)使用提供的所有上下文信息在元素上創(chuàng)建綁定。最妙的是,如果需要,我們可以為每個元素定制綁定行為。CM為ConventionManager上的大多數(shù)元素定義了ApplyBinding的基本實現(xiàn)。這叫做挫折,看起來像這樣:

public static Func<Type, string, PropertyInfo, FrameworkElement, ElementConvention, bool> SetBinding =(viewModelType, path, property, element, convention) => {var bindableProperty = convention.GetBindableProperty(element);if(HasBinding(element, bindableProperty))return false;var binding = new Binding(path);ApplyBindingMode(binding, property);ApplyValueConverter(binding, bindableProperty, property);ApplyStringFormat(binding, convention, property);ApplyValidation(binding, viewModelType, property);ApplyUpdateSourceTrigger(bindableProperty, element, binding);BindingOperations.SetBinding(element, bindableProperty, binding);return true;};

此方法所做的第一件事是通過調(diào)用ElementConvention上的GetBindableProperty來獲取應(yīng)該綁定的依賴項屬性。接下來,我們檢查該屬性是否已經(jīng)存在綁定集。如果有,我們不想覆蓋它。開發(fā)人員可能在這里做了一些特殊的事情,因此我們返回false,表示尚未添加綁定。假設(shè)不存在綁定,該方法基本上會委托ConventionManager上的其他方法來獲取綁定應(yīng)用程序的詳細(xì)信息。希望這一部分有意義。一旦綁定被完全構(gòu)造,我們將其添加到元素中,并返回true,指示應(yīng)用了約定。

屬性匹配還有另一個重要方面,我還沒有提到。我們也可以通過約定在深層屬性路徑上進(jìn)行匹配。因此,假設(shè)您的ViewModel上有一個Customer屬性,它有一個FirstName屬性,您希望將文本框綁定到該屬性。只需給文本框一個x:Name“Customer_FirstName”,ViewModelBinder將完成所有工作以確保該屬性有效,并將正確的視圖模型類型、屬性信息和屬性路徑傳遞給ElementConvention的ApplyBinding函數(shù)。

其他需要知道的事情

我在上面提到,“CM為大多數(shù)元素定義了ApplyBinding的基本實現(xiàn)。”它還為通常與特定使用模式或組合關(guān)聯(lián)的元素定義了ApplyBinding Func的幾個自定義實現(xiàn)。對于WPF和Silverlight,ItemsControl和Selector具有自定義綁定行為。除了在ItemsControl上綁定ItemsSource外,ApplyBinding函數(shù)還檢查ItemTemplate、DisplayMemberPath和ItemTemplateSelector(WPF)屬性。如果這些都沒有設(shè)置,那么框架就會知道,由于您沒有為項目指定呈現(xiàn)器,它應(yīng)該按常規(guī)添加一個。7因此,我們將ItemTemplate設(shè)置為默認(rèn)DataTemplate。下面是它的樣子:

<DataTemplate xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:cal="clr-namespace:Caliburn.Micro;assembly=Caliburn.Micro"><ContentControl cal:View.Model="{Binding}" VerticalContentAlignment="Stretch"HorizontalContentAlignment="Stretch" /> </DataTemplate>

由于此模板創(chuàng)建了一個帶有View.Model附加屬性的ContentControl,因此我們?yōu)镮temsControl創(chuàng)建了豐富組合的可能性。因此,無論項目是什么,View.Model attached屬性都允許我們調(diào)用ViewModel First工作流:找到項目的視圖,將項目和視圖傳遞給ViewModelBinder(ViewModelBinder反過來設(shè)置自己的約定,可能會調(diào)用更多組合),然后獲取視圖并將其注入ContentControl。選擇器的行為與ItemsControl相同,但在SelectedItem屬性周圍有一個附加約定。假設(shè)您的選擇器稱為Items。我們首先遵循上述約定,將ItemsSource綁定到Items,并檢測是否需要添加默認(rèn)的DataTemplate。然后,檢查SelectedItem屬性是否已綁定。如果沒有,我們將在ViewModel上查找可以綁定到SelectedItem的三個候選屬性:ActiveItem、SelectedItem和CurrentItem。如果找到其中一個,我們將添加綁定。因此,這里的模式是,我們首先調(diào)用ConventionManager.Singularize來指定集合屬性的名稱。在這種情況下,“Items”變?yōu)椤癐tem”,然后我們稱ConventionManager.DerivePotentialSelectionNames,它在“Active”、“Selected”和“Current”前面加上“Active”和“Current”以使上述三個候選項成為“Item”。然后,如果在ViewModel上找到其中一個,我們將創(chuàng)建一個綁定。對于WPF,我們?yōu)門abControl提供了一個特殊的ApplyBinding行為。8它采用選擇器的所有約定(將其ContentTemplate而不是ItemTemplate設(shè)置為DefaultDataTemplate),并為選項卡標(biāo)題的內(nèi)容提供了一個附加約定。如果未設(shè)置TabControl的DisplayMemberPath,并且ViewModel實現(xiàn)IHaveDisplayName,則我們將其ItemTemplate設(shè)置為DefaultHeaderTemplate,如下所示:

<DataTemplate xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"><TextBlock Text="{Binding DisplayName, Mode=TwoWay}" /> </DataTemplate>

因此,對于命名的WPF TabControl,我們可以常規(guī)地在選項卡列表(ItemsSource)中綁定選項卡項的名稱(ItemTemplate)、每個選項卡的內(nèi)容(ContentTemplate),并保持所選選項卡與模型同步(SelectedItem)。對于這樣一行Xaml來說,這還不錯:

<TabControl x:Name="Items" />

除了上面列出的特殊情況外,我們還有一個很重要的問題:ContentControl。在本例中,我們不提供自定義ApplyBinding函數(shù),但提供自定義GetBindableProperty函數(shù)。對于ContentControl,當(dāng)我們決定綁定到哪個屬性時,我們檢查ContentTemplate和ContentTemplateSelector(WPF)。如果它們都為null,則表示尚未為模型指定渲染器。因此,我們假設(shè)您希望使用ViewModel First工作流。我們通過讓GetBindableProperty函數(shù)返回View.Model attached屬性作為要綁定的屬性來實現(xiàn)這一點(diǎn)。在所有其他情況下,ContentControl將綁定到Content屬性。通過在沒有ContentTemplate的情況下選擇View.Model屬性,我們可以實現(xiàn)豐富的合成。

我希望當(dāng)你思考這些特殊情況時,你會發(fā)現(xiàn)它們是有道理的。一如既往,如果你不喜歡它們,你可以改變它們…

定制

正如您所想象的,通過替換ViewModelBinder上的Func,BindProperties功能完全可以自定義。例如,如果你喜歡動作約定而不是屬性約定,你可以用一個不做任何事情的Func替換這個Func。然而,您可能需要更細(xì)粒度的控制。幸運(yùn)的是,ConventionManager或特定ElementConvention的幾乎每個方面都是可定制的。有關(guān)ConventionManager的更多詳細(xì)信息如下。

配置約定的常用方法之一是向系統(tǒng)中添加新約定。最常見的情況是添加Silverlight toolkit控件或WP7 toolkit控件。下面是一個示例,說明如何為WP7 Pivot控件設(shè)置一個高級約定,使其與WPF TabControl類似:

ConventionManager.AddElementConvention<Pivot>(Pivot.ItemsSourceProperty, "SelectedItem", "SelectionChanged").ApplyBinding =(viewModelType, path, property, element, convention) => {ConventionManager.GetElementConvention(typeof(ItemsControl)).ApplyBinding(viewModelType, path, property, element, convention);ConventionManager.ConfigureSelectedItem(element, Pivot.SelectedItemProperty, viewModelType, path);ConventionManager.ApplyHeaderTemplate(element, Pivot.HeaderTemplateProperty, viewModelType);};

很酷吧?

框架使用

BindProperties僅由ViewModelBinder使用。

會議經(jīng)理

如果您已經(jīng)閱讀了本文,您就會知道ConventionManager在很大程度上受到操作和屬性綁定機(jī)制的影響。它是微調(diào)框架中大多數(shù)約定行為的網(wǎng)關(guān)。以下是可用于自定義框架約定的可替換函數(shù)和屬性的列表:

性質(zhì)

BooleantVisibilityConverter–用于將布爾值轉(zhuǎn)換為可見性并返回的默認(rèn)IValueConverter。由ApplyValueConverter使用。

IncludeStaticProperties-指示在約定名稱匹配期間是否應(yīng)包括靜態(tài)屬性。默認(rèn)情況下為False。

DefaultItemTemplate–當(dāng)ItemsControl或ContentControl需要DataTemplate時使用。

DefaultHeaderTemplate–當(dāng)TabControl需要標(biāo)題模板時,由ApplyHeaderTemplate使用。

芬克斯

單數(shù)化–將單詞從復(fù)數(shù)形式轉(zhuǎn)換為單數(shù)形式。默認(rèn)的實現(xiàn)是非常基本的,只是去掉了后面的's'。

DerivePotentialSelectionNames–給定基本集合名稱,返回表示所選內(nèi)容的可能屬性名稱列表。使用Singularize。

SetBinding–ElementConventions使用的ApplyBinding的默認(rèn)實現(xiàn)(更多信息見下文)。更改此選項將更改所有常規(guī)綁定的應(yīng)用方式。在內(nèi)部使用以下函數(shù):

HasBinding—確定特定依賴項屬性是否已在提供的元素上具有綁定。如果綁定已存在,則SetBinding將中止。

ApplyBindingMode-將適當(dāng)?shù)慕壎J綉?yīng)用于綁定。

ApplyValidation—確定是否以及在綁定上啟用何種類型的驗證。

ApplyValueConverter-確定是否需要值轉(zhuǎn)換器,并將其應(yīng)用于綁定。默認(rèn)情況下,它僅檢查BooleanToVisibility轉(zhuǎn)換。

ApplyStringFormat-確定是否需要自定義字符串格式并將其應(yīng)用于綁定。默認(rèn)情況下,如果綁定到日期時間,則使用格式“{0:MM/dd/yyyy}”。

ApplyUpdateSourceTrigger-確定是否應(yīng)將自定義更新源觸發(fā)器應(yīng)用于綁定。對于WPF,始終設(shè)置為UpdateSourceTrigger=PropertyChanged。對于Silverlight,調(diào)用ApplySlverLightTriggers。

例如,讓ChangeConventionManager.Singularize使用令人敬畏的庫人性化工具。

ConventionManager.Singularize = original => original.Singularize(inputIsKnownToBePlural: false);

方法

AddElementConvention–添加或替換ElementConvention。

GetElementConvention–獲取特定元素類型的約定。如果未找到,則在類型層次結(jié)構(gòu)中搜索匹配項。

ApplyHeaderTemplate–將標(biāo)頭模板約定應(yīng)用于元素。

ApplySlverLightTriggers–對于TextBox和PasswordBox,將適當(dāng)?shù)氖录B接到綁定更新,以模擬WPF的UpdateSourceTrigger=PropertyChanged。

ElementConvention

元素約定

可以通過ConventionManager.AddElementConvention添加或替換元素約定。但是,了解這些約定是什么以及在整個框架中如何使用它們是很重要的。在本文的最底部是一個代碼列表,它顯示了如何開箱即用地配置所有元素。以下是ElementConvention類的屬性和函數(shù)以及簡要說明:

Properties

ElementType–約定適用的元素類型。

ParameterProperty–使用Message.Attach聲明操作時,如果指定了引用元素的參數(shù),但未指定該元素的屬性,則將查找ElementConvention并使用ParameterProperty。例如,如果我們有此標(biāo)記:

<TextBox x:Name="something" /> <Button cal:Message.Attach="MyMethod(something)" />

當(dāng)按鈕的ActionMessage被創(chuàng)建時,我們會查找“某物”,這是一個文本框。我們得到TextBox的ElementConvention,它的ParameterProperty設(shè)置為“Text”。因此,我們從something.Text創(chuàng)建MyMethod的參數(shù)。

芬克斯

GetBindableProperty–獲取應(yīng)在約定綁定中使用的元素的屬性。

CreateTrigger–當(dāng)Message.Attach用于聲明操作,且未指定特定事件時,將查找ElementConvention并調(diào)用CreateTrigger Func來創(chuàng)建Interaction.Trigger。例如,在上面的Xaml中,當(dāng)為按鈕創(chuàng)建ActionMessage時,將查找按鈕的ElementConvention并調(diào)用其CreateTrigger函數(shù)。在這種情況下,ElementConvention返回一個配置為使用Click事件的EventTrigger。

ApplyBinding–如上所述,當(dāng)發(fā)生常規(guī)數(shù)據(jù)綁定時,我們正在綁定的元素將查找其ElementConvention,并調(diào)用其ApplyBinding func。默認(rèn)情況下,這只傳遞給ConventionManager.SetBinding。但某些元素(見上文…或下文)對此進(jìn)行了定制,以實現(xiàn)更強(qiáng)大的合成場景。

ConventionManager上有一個名為AddElementConvention的助手方法,可以這樣使用:

ConventionManager.AddElementConvention<Rating>(Rating.ValueProperty, "Value", "ValueChanged");

在上述情況下,Rating.ValueProperty的第一個參數(shù)值告訴約定系統(tǒng)元素的默認(rèn)可綁定屬性是什么。因此,如果我們在評級控件上有一個約定匹配,我們將針對ValueProperty設(shè)置綁定。第二個參數(shù)表示要在操作綁定中使用的默認(rèn)屬性。因此,如果您使用指向分級控件的ElementName創(chuàng)建了一個操作綁定,但沒有指定屬性,那么我們將返回到“Value”屬性。最后,第三個參數(shù)表示控件的默認(rèn)事件。因此,如果我們將操作附加到評級控件,但沒有指定觸發(fā)該操作的事件,則系統(tǒng)將退回到“ValueChanged”事件。這些元素約定允許開發(fā)人員在各種情況下提供盡可能多或盡可能少的信息,允許框架適當(dāng)?shù)靥畛淙鄙俚募?xì)節(jié)。

02

最后

原文標(biāo)題:Caliburn.Micro Xaml made easy

原文鏈接:https://caliburnmicro.com/documentation/conventions

翻譯:dotnet編程大全

C#技術(shù)群?:?添加小編微信mm1552923,備注:進(jìn)群!

總結(jié)

以上是生活随笔為你收集整理的C# WPF MVVM开发框架Caliburn.Micro 关于Conventions⑧的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

在线观看av免费观看 | 国产色网站 | 999一区二区三区 | 亚洲成人精品av | 亚洲成 人精品 | 欧美视频网址 | 一级黄视频| 在线a人v观看视频 | 日韩精品一区电影 | 久草在线视频国产 | 91免费高清 | 久久婷婷视频 | 国产精品a成v人在线播放 | 亚洲精品小视频 | 国产精品亚| 国产免费专区 | 免费黄色在线网址 | 国产精品一区二区精品视频免费看 | 一区二区三区高清在线 | 国产成人精品一区二区三区在线观看 | 国产黄在线播放 | 蜜桃av人人夜夜澡人人爽 | 色婷婷www| 成人黄在线 | 亚洲最快最全在线视频 | 人人看人人艹 | 91日韩在线播放 | 97在线观看| 国产视频在线免费 | 在线观看视频免费播放 | 中文字幕国语官网在线视频 | www91在线观看 | 国产伦理久久精品久久久久_ | 国产精品入口a级 | 免费看的黄色的网站 | 中文字幕日韩精品有码视频 | 中文字幕成人在线观看 | www.夜夜干.com | 国产精品日韩欧美一区二区 | 天天干夜夜干 | 激情视频免费在线观看 | 狠狠狠色丁香婷婷综合激情 | 精品视频123区在线观看 | 国产在线精品播放 | 欧美a视频 | 久久久久这里只有精品 | 97超碰在线资源 | 久久免费毛片 | 欧美日韩亚洲国产一区 | 91麻豆精品国产午夜天堂 | 97在线观看| 亚州精品视频 | 亚洲日韩欧美一区二区在线 | 看黄色91 | 青青视频一区 | free. 性欧美.com | 久久久人人人 | 深夜免费网站 | 美女免费视频观看网站 | 高清av网站| 中文字幕在线观看你懂的 | 欧美视频不卡 | 久久婷五月 | 一区二区三区 中文字幕 | 天天综合网在线观看 | a特级毛片 | 亚洲综合一区二区精品导航 | 天天精品视频 | 精品在线观| 国产高清无线码2021 | 国产在线超碰 | 午夜视频在线网站 | 日日干天天射 | 欧美亚洲成人免费 | 91麻豆精品国产91久久久久 | 国产麻豆果冻传媒在线观看 | 亚洲欧美国产精品久久久久 | 久草久草在线观看 | 中文字幕中文 | 狂野欧美激情性xxxx欧美 | 西西4444www大胆艺术 | 欧洲亚洲国产视频 | 精品久久久久国产 | 亚洲免费公开视频 | 亚洲一区日韩精品 | 美女视频a美女大全免费下载蜜臀 | 美女网站色免费 | 日韩免费一级a毛片在线播放一级 | 中文字幕在线观看免费 | 在线观看中文 | 99久久综合狠狠综合久久 | 99免费在线观看视频 | 黄色三级久久 | 亚洲精品av中文字幕在线在线 | 免费在线视频一区二区 | 亚洲激情久久 | 色噜噜噜噜 | 国产美女免费 | 精品福利网 | 麻豆91精品视频 | 中文字幕在线视频一区二区三区 | 日本黄色免费网站 | 成人av免费看 | 色小说在线 | 国产丝袜制服在线 | 国产精品精品久久久久久 | 18国产精品白浆在线观看免费 | 999久久久久久久久6666 | 日本色小说视频 | 看污网站 | 中文字幕一区二区三区四区 | 在线观看www91 | 东方av免费在线观看 | 欧美精品中文字幕亚洲专区 | 亚洲五月婷婷 | 久久人操 | 91免费版在线 | 亚洲精品久久视频 | 日韩xxx视频| 国产资源网 | 久久免费看a级毛毛片 | 欧美精品在线视频 | 免费av免费观看 | 欧美日韩在线播放 | 最近2019中文免费高清视频观看www99 | 久久综合操 | 日韩av黄| 久久综合欧美 | 日日夜夜精品免费观看 | 青青河边草观看完整版高清 | 欧洲黄色片 | 一区二区 久久 | 美女福利视频一区二区 | 天天碰天天操 | 国产精品一区二区在线看 | 一色屋精品视频在线观看 | 久草免费在线观看 | 国产一级免费视频 | 91九色蝌蚪在线 | 91大神电影 | 日韩视频在线观看免费 | 国产精品国产三级国产专区53 | 激情偷乱人伦小说视频在线观看 | 日韩精品免费在线播放 | 国产成人精品一区二三区 | 婷婷av综合 | 97超在线 | 999成人 | 久久久在线观看 | 91av原创| 天天曰天天曰 | 天天操夜夜操国产精品 | 懂色av懂色av粉嫩av分享吧 | 成人资源在线观看 | 国产一区二区三区午夜 | 免费看国产视频 | 午夜精品福利一区二区三区蜜桃 | 在线 视频 一区二区 | 欧美黑人巨大xxxxx | 色资源网在线观看 | 日韩久久精品一区二区 | 黄色av免费看 | 免费av电影网站 | 黄av免费| 国产精品av免费在线观看 | 中文资源在线播放 | 成人国产在线 | 午夜性色| 一区二区不卡高清 | 国产123区在线观看 国产精品麻豆91 | 国产区精品区 | 久久电影网站中文字幕 | 99色在线观看视频 | 成年人在线免费看视频 | 男女男视频 | 国产又粗又长又硬免费视频 | 国产高清在线 | 国产精彩在线视频 | 在线观看aaa | 国产精品久久久久久久久大全 | 国内精品在线一区 | 久热色超碰 | 中文字幕亚洲精品日韩 | 成人午夜电影在线观看 | av在线网站观看 | 久久精品一二三 | 免费观看国产精品 | 国产在线观看国语版免费 | 开心激情婷婷 | 久久久91精品国产一区二区三区 | 免费裸体视频网 | 亚州精品视频 | 国产高清免费av | 久久综合中文字幕 | 亚洲在线a | 久久天天操 | 免费碰碰| 国产人成精品一区二区三 | 911精品视频 | 成人av资源网 | 天天天综合 | 色综合色综合久久综合频道88 | 狠狠干综合| 在线三级av | 日韩色在线观看 | a黄色大片 | 欧美日韩性视频在线 | 91成年人视频 | 99精品一区二区 | 久久精品亚洲国产 | 国产精品久久久久影视 | 三级黄色理论片 | 99在线观看免费视频精品观看 | 亚洲在线色| 国产成人精品国内自产拍免费看 | 国产一级视频在线免费观看 | 天天操天天干天天插 | 永久免费的av电影 | 精品视频99 | 久久精品人人做人人综合老师 | 色婷婷久久一区二区 | 一级片免费观看视频 | 久久精品亚洲综合专区 | 精品人人爽| 日韩视 | 天天射天天爱天天干 | 国产99久久精品一区二区永久免费 | 国产在线播放一区二区三区 | 亚洲国产成人精品久久 | 91麻豆精品国产91久久久久久 | 99精品国产免费久久 | 精品999| 中文字幕电影在线 | 国产精品久久久久久久午夜 | 久久久久女人精品毛片 | 日日夜夜网 | 亚洲闷骚少妇在线观看网站 | 大胆欧美gogo免费视频一二区 | 人人澡超碰碰97碰碰碰软件 | 日韩网 | 一二区电影 | 久久久精品日本 | 欧美日韩国产在线精品 | 黄色av三级在线 | 十八岁以下禁止观看的1000个网站 | 亚洲精品国产精品久久99热 | 亚洲视频在线播放 | 日本系列中文字幕 | 8090yy亚洲精品久久 | 亚洲激精日韩激精欧美精品 | 久久久久成人精品免费播放动漫 | 人操人 | 在线免费观看黄色 | 有码视频在线观看 | 国产在线精品一区二区三区 | 久草在线观 | 久久国产三级 | 欧美日韩性生活 | 麻花豆传媒一二三产区 | 亚洲狠狠丁香婷婷综合久久久 | 狠狠狠狠狠狠狠狠干 | 欧美一级片免费观看 | 国产高清久久久 | 久久综合九色欧美综合狠狠 | 免费无遮挡动漫网站 | 黄色免费网站大全 | 久精品在线| 97天天综合网 | 亚洲一级性 | 久草在线观 | 欧美精品在线一区二区 | 欧美一级久久久 | 久久蜜臀一区二区三区av | 在线观看91网站 | 黄色一级大片免费看 | 久久久久精 | 欧美一区二区三区免费看 | 免费av电影网站 | 六月激情 | 免费观看国产精品 | 日韩一区二区三免费高清在线观看 | 97超碰在线久草超碰在线观看 | 91成人短视频在线观看 | 欧美在线观看视频一区二区 | 久久久精品网站 | 久久精品视频网站 | 一级黄色片在线免费看 | 日韩在线高清免费视频 | 美腿丝袜一区二区三区 | 91九色蝌蚪视频在线 | 亚洲综合五月天 | 超碰97久久| 久久免费a| 天天插天天干天天操 | 色综合婷婷久久 | 亚洲无在线 | 亚洲精品在线观看免费 | 国产精品麻| 天天操夜夜操国产精品 | 亚洲一区二区三区毛片 | 免费在线播放视频 | 色婷婷综合在线 | www.国产精品 | 亚洲三级av | 在线观看黄色小视频 | 午夜a区| 91麻豆精品国产91 | 午夜在线观看一区 | 国产区在线 | av片子在线观看 | 色黄视频免费观看 | av中文字幕在线电影 | 亚洲更新最快 | 91亚洲欧美 | 精品一区二区综合 | 贫乳av女优大全 | 激情视频一区二区三区 | 久久精品一区二区三区四区 | 国产精品欧美久久久久天天影视 | www五月| 91精品免费看| 色欧美综合 | 一级淫片a | 4hu视频 | 午夜av免费观看 | 日韩电影在线观看一区二区三区 | 丁香婷婷激情啪啪 | 一区二区三区国产欧美 | 玖草影院 | 成人毛片一区二区三区 | 免费在线激情电影 | av免费电影在线 | 91看片淫黄大片91 | 亚洲天堂精品视频在线观看 | 在线观看日韩视频 | 人人涩 | 欧美精品生活片 | 天天摸日日摸人人看 | 97超碰中文字幕 | 久热av | 国产做a爱一级久久 | 精品三级av | 国产乱对白刺激视频在线观看女王 | 国产成人精品一区二区在线观看 | 日韩1页| 综合网av | 精品在线视频一区 | 午夜影视剧场 | 国产一区免费观看 | 国产一区二三区好的 | 日韩在线字幕 | 免费在线黄 | 天天伊人网| 天天射天天操天天色 | 人人干在线观看 | 99热精品免费观看 | 日韩首页 | 日韩精品五月天 | 久国产在线播放 | 91精品一区二区在线观看 | 久久999精品 | 综合在线观看色 | 亚洲精品乱码久久久久久蜜桃不爽 | 日韩av视屏在线观看 | 人人玩人人弄 | 日韩色一区二区三区 | 中文字幕视频免费观看 | 国产一卡二卡四卡国 | 天天射天天拍 | 午夜精品久久久久久久久久久 | 人人干人人干人人干 | 99视频免费看| 日韩av进入| 亚洲精品国产精品乱码在线观看 | 日韩精品国产一区 | 狠狠干天天射 | 色综合婷婷 | 69中文字幕 | 日韩精品在线免费播放 | 在线视频麻豆 | 婷婷精品国产一区二区三区日韩 | 国产精品国内免费一区二区三区 | 欧美激情第一页xxx 午夜性福利 | 久久久久久美女 | 国产精品99久久久久人中文网介绍 | 日韩精品欧美一区 | 97在线视频免费看 | 国产视频资源 | 久久久伦理 | 97在线视频免费看 | 在线播放国产精品 | www久久久 | 久久一级片 | 91久久黄色 | 国产精品原创视频 | 久久久毛片 | 国产精品美女免费 | 91av色| 三级视频日韩 | 天堂中文在线播放 | 免费黄色一区 | 中文字幕精品一区久久久久 | 91视频麻豆 | 91视视频在线直接观看在线看网页在线看 | 国产成人精品一区二区三区在线 | 激情网综合| 黄网站色成年免费观看 | 国产热re99久久6国产精品 | 一级片黄色片网站 | 国产在线观看一区 | 国产三级av在线 | 久久大视频| 日韩在线免费小视频 | 久久久伦理 | 18网站在线观看 | 天天干,天天操,天天射 | 亚洲激情综合 | 91亚洲夫妻 | 一区二区三区韩国免费中文网站 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 一区精品在线 | 日韩av中文字幕在线 | 又黄又刺激视频 | 91精品国产入口 | 午夜久久久久久久久 | 亚洲天堂网站视频 | 成人动漫精品一区二区 | 色综合中文字幕 | 91精品影视 | 91资源在线视频 | 国产一区在线免费 | 国产精品国产三级国产aⅴ入口 | 国产一卡二卡四卡国 | 精品久久久久久久久久久院品网 | 中文字幕三区 | 日日躁你夜夜躁你av蜜 | 国产一区 在线播放 | 在线导航av | 色永久免费视频 | 91视频久久久 | 97成人精品视频在线播放 | 日本一区二区不卡高清 | 日本美女xx | 四虎成人免费影院 | 免费国产在线观看 | 国产又粗又猛又黄又爽的视频 | 成人免费网站视频 | 亚洲精品成人免费 | 日韩一区二区在线免费观看 | 亚洲aaa级| 精品你懂的 | 99久热在线精品视频观看 | www蜜桃视频| 亚洲在线a| 91精品婷婷国产综合久久蝌蚪 | 午夜久久久精品 | 在线播放国产精品 | 国产专区视频在线观看 | 在线91视频| 97福利视频 | 日韩av在线网站 | 一区二区三区中文字幕在线 | 国产精品视频久久久 | 日韩在线视频免费播放 | 一区二区三区电影在线播 | 国产精品久久av | 国产麻豆视频免费观看 | av中文字幕av | 日韩欧美在线影院 | 中文资源在线官网 | 久久久久久中文字幕 | 婷婷综合久久 | 国产精品24小时在线观看 | 国产大尺度视频 | 日本精品一区二区三区在线播放视频 | 97福利在线 | 国产精品免费一区二区三区 | 91热视频| 国产人成看黄久久久久久久久 | 黄色成人影视 | 一级大片在线观看 | 久久久久草 | 色综合天天综合在线视频 | 999久久久久久久久久久 | 丁香婷婷久久久综合精品国产 | 久久久久网站 | 国产剧在线观看片 | 亚洲黄色片 | 色网站免费在线观看 | 粉嫩av一区二区三区四区在线观看 | 亚洲天天在线日亚洲洲精 | 爱av在线网| www激情久久 | 精品一二三区 | 国产无吗一区二区三区在线欢 | 国产成人精品一区二区三区福利 | 日韩在线免费视频 | 狠狠色丁香 | 91av亚洲| 国产一级精品视频 | 在线看国产精品 | 91传媒视频在线观看 | 欧美在线视频a | 91麻豆精品国产自产 | av成人在线播放 | 成年人免费电影在线观看 | 亚洲天堂精品视频在线观看 | 欧美精品九九99久久 | 97超碰人人干 | 日韩在线观看视频在线 | 91成人免费观看视频 | 久久你懂的 | 中文字幕一区二区三区四区久久 | 国产又粗又猛又色又黄视频 | 九色91在线视频 | 婷婷综合久久 | 国产视频导航 | 亚洲国产成人精品电影在线观看 | 天天插天天狠天天透 | 久久中文网 | 亚洲综合色播 | 久久激情网站 | av电影在线不卡 | www国产亚洲精品久久麻豆 | 丁香久久综合 | 激情婷婷久久 | 日韩va欧美va亚洲va久久 | 久久99精品久久久久久三级 | 在线 欧美 日韩 | 99久久综合精品五月天 | 日韩在线网址 | 亚洲激情综合 | 看黄色91| 99久久精品午夜一区二区小说 | 日本二区三区在线 | 日韩夜夜爽 | 三级黄色片在线观看 | 色av资源网 | 国产三级av在线 | 超碰97中文 | 国产日韩一区在线 | av在线永久免费观看 | 国产一及片 | 亚洲经典精品 | 91在线免费观看国产 | 久久久国产精品一区二区三区 | 九九热免费观看 | 日韩精品久久久久久 | 国产在线欧美日韩 | 麻豆影视在线播放 | 国产最新在线视频 | 日韩精品在线看 | 国产中文在线视频 | 午夜av免费在线观看 | 久久精品中文字幕 | 中文字幕在线观看一区二区 | 就色干综合 | 操操操天天操 | 天堂av在线网站 | 91大片网站 | 国产视频精品网 | .精品久久久麻豆国产精品 亚洲va欧美 | 91精选在线观看 | 99精品在线免费在线观看 | 极品美女被弄高潮视频网站 | 日韩视频在线不卡 | 日日夜夜天天 | 精品在线看 | a天堂免费 | 国产在线观看中文字幕 | 伊人久久一区 | 成人黄色小说视频 | 玖草影院 | 亚洲乱码精品 | 亚洲一区 av | 外国av网 | 一二区电影 | 国产小视频福利在线 | 99久久精品免费看国产免费软件 | 精品少妇一区二区三区在线 | 永久免费毛片在线观看 | 国产精品乱码高清在线看 | 黄色一集片| 日韩区视频 | 免费一级特黄毛大片 | 911香蕉| 成人午夜片av在线看 | 黄色三级在线看 | 中文字幕永久在线 | 在线观看免费视频你懂的 | av中文在线 | 免费av片在线| 一级特黄aaa大片在线观看 | 国产精品一区二区在线看 | 九九热精品在线 | 色视频 在线 | 成人免费观看电影 | 日韩激情影院 | 免费一级片在线观看 | 8x成人免费视频 | 天天综合成人 | 久久精品国产久精国产 | 久久久久久久久久久免费 | 99热精品在线观看 | 国产裸体视频bbbbb | 最近日本韩国中文字幕 | 狠狠干.com | 日韩成人精品一区二区三区 | 欧美日韩破处 | 中文字幕在线视频免费播放 | 超碰97国产 | 伊人亚洲综合 | 69视频在线播放 | 国产成人三级在线播放 | 日韩久久精品一区二区三区下载 | 四虎在线影视 | 97精品伊人 | 亚洲精品美女在线 | 奇米影视在线99精品 | 黄网站a| 亚洲精区二区三区四区麻豆 | 粉嫩av一区二区三区入口 | 国产精品入口麻豆 | 91人人爽久久涩噜噜噜 | 国产精品免费观看视频 | 日韩在线观看第一页 | 麻豆国产电影 | 欧美成人91 | 国产91粉嫩白浆在线观看 | av福利超碰网站 | 一区二区三区中文字幕在线观看 | 亚洲激色| 欧美在线视频日韩 | 久久国产精彩视频 | 高清视频一区二区三区 | 国产麻豆剧果冻传媒视频播放量 | 一级全黄毛片 | 国产精品正在播放 | 99草在线视频 | 欧美一二三区在线观看 | 高清av免费观看 | 五月天中文字幕 | 日韩在线视频网站 | 在线 国产 亚洲 欧美 | 伊人资源站| 韩国中文三级 | 91精品国产综合久久福利不卡 | 国产精品11 | 中文久久精品 | 久久综合久色欧美综合狠狠 | 成人av一级片 | www..com黄色片 | 69视频网站 | 最新动作电影 | 亚洲精品美女久久久久 | 中国精品少妇 | 国产精品一区二区av影院萌芽 | 日韩av手机在线看 | 精品成人在线 | 日韩xxxbbb| 成人av在线观 | 狠狠躁日日躁夜夜躁av | 国产丝袜一区二区三区 | 久久久久久久国产精品 | 国产麻豆视频免费观看 | 五月婷婷六月丁香 | 超碰.com| 最近最新中文字幕 | 国产中年夫妇高潮精品视频 | 在线小视频你懂的 | avcom在线 | 二区在线播放 | 日韩一三区 | 精品国产视频一区 | 日韩在线三区 | 特级毛片网 | 中文字幕视频 | 亚洲精品乱码久久久久久久久久 | 亚洲国产人午在线一二区 | av中文字幕在线观看网站 | 国产美腿白丝袜足在线av | 国产一区二区手机在线观看 | 久久久久综合精品福利啪啪 | 伊人资源视频在线 | 久久久精品国产一区二区电影四季 | 在线免费观看黄网站 | 麻豆视频一区 | 久久久久国产成人免费精品免费 | 岛国大片免费视频 | 欧美日韩在线视频一区 | 亚洲精品国产精品国自产 | 91成人精品视频 | 国产a精品 | 免费在线激情电影 | 日韩精品资源 | 在线色亚洲| 国产高清网站 | 午夜在线资源 | 亚洲精品视频免费在线观看 | 伊人国产在线播放 | 中文字幕一区二区三区在线播放 | 精品国产一区二区三区久久影院 | 欧美日韩免费观看一区二区三区 | 色综合久久综合网 | 中文字幕在线视频网站 | 亚洲精品资源在线观看 | se视频网址| 午夜视频久久久 | 亚洲精品一区二区三区四区高清 | 韩国精品福利一区二区三区 | 玖玖玖在线观看 | 99久久久国产免费 | 夜夜操狠狠操 | 日韩美在线观看 | 精品国产亚洲在线 | www.成人久久 | 久久久久久免费视频 | 欧美日韩一区二区久久 | 最近最新最好看中文视频 | 波多野结衣电影一区二区三区 | 国产免码va在线观看免费 | 免费a级观看| а天堂中文最新一区二区三区 | 毛片视频电影 | www.天天操.com | 91高清完整版在线观看 | 一级淫片在线观看 | 高清国产在线一区 | 又黄又爽又色无遮挡免费 | 在线观看一区视频 | 人人dvd| 免费黄色一区 | 久久久久激情 | 天天夜夜狠狠操 | 一区二区三区在线播放 | 日韩网站在线播放 | 欧美日韩精品免费观看视频 | 人人艹视频| 日韩在线观看第一页 | 亚洲狠狠操 | 97国产精品久久 | 狠狠操欧美 | 国产精品专区一 | 久久不见久久见免费影院 | 久久久久成人精品 | 99精品视频99 | 欧美激情xxxx性bbbb | 992tv在线| 国产精品毛片一区二区 | 黄色软件在线看 | www久久99 | 美女性爽视频国产免费app | 日韩电影在线看 | 国产精品女主播一区二区三区 | 欧美极品一区二区三区 | 九九欧美视频 | 五月婷婷色丁香 | 九九热久久久 | 国内外成人免费在线视频 | 久久久久久久99精品免费观看 | 久久a v电影 | 久久99深爱久久99精品 | 亚洲欧美成人在线 | 午夜视频在线观看一区二区 | 在线一二三四区 | 亚洲一二区精品 | 精品国产免费看 | 人人干天天干 | 婷婷色网视频在线播放 | 亚洲精品国产成人 | 国产97在线视频 | 成人黄大片视频在线观看 | 超碰av在线播放 | 天天天干天天天操 | 香蕉视频在线播放 | 欧美日韩中文国产一区发布 | 视频国产在线 | 91麻豆网站 | 国产97免费 | 欧美视频不卡 | 亚洲国产中文字幕在线观看 | 国产一级91 | 综合激情久久 | av色影院| 四虎天堂 | 麻豆91精品| 久久一视频 | 国产成本人视频在线观看 | www天天操| 日韩啪啪小视频 | 激情视频区 | 国产精品初高中精品久久 | 国产精品美女久久久免费 | 中文av在线免费观看 | 国产精品1区2区3区 久久免费视频7 | 国产综合精品一区二区三区 | 欧美日韩高清一区 | 国产高清 不卡 | 天天综合网国产 | 欧美大片aaa | 亚洲伊人第一页 | 一色屋精品视频在线观看 | 精品国产欧美一区二区三区不卡 | 欧美一级专区免费大片 | 夜夜躁天天躁很躁波 | 国产资源中文字幕 | 国产喷水在线 | 午夜三级福利 | 欧美极品少妇xxxx | 99精品成人 | 国产高清中文字幕 | 婷婷色狠狠 | 久久成人精品电影 | 亚洲自拍av在线 | 91综合视频在线观看 | 国产午夜在线观看视频 | 国产91粉嫩白浆在线观看 | 三级黄色在线 | www..com毛片| 99在线免费视频观看 | 日韩中文字 | 日本大尺码专区mv | 成人h动漫精品一区二 | 国产精品一区二区三区在线看 | 欧美日比视频 | 欧美激情视频免费看 | 日韩在线视频免费观看 | 国产vs久久 | 菠萝菠萝在线精品视频 | 国产小视频免费在线观看 | 亚洲精品影视 | 欧美久久久影院 | 日韩av电影网站在线观看 | 久久精品国产亚洲精品2020 | 精品日韩在线 | 国产高清不卡在线 | 国产一级高清视频 | 成人毛片网 | 久草视频在线免费播放 | 五月婷婷六月丁香激情 | 亚洲欧美日韩国产一区二区三区 | 久久一精品| 亚洲精品视频国产 | 国产美女网站视频 | 国产亚洲午夜高清国产拍精品 | av电影免费观看 | 深夜精品福利 | 国产成人高清av | 日日夜夜天天久久 | 久久精品一区二区国产 | 婷婷精品国产欧美精品亚洲人人爽 | 久久精品视频观看 | 区一区二区三区中文字幕 | 精品久久精品久久 | 亚洲免费在线观看视频 | 久久99久国产精品黄毛片入口 | 香蕉视频在线观看免费 | 综合色站导航 | 欧美日韩国产亚洲乱码字幕 | 国产视频精品视频 | 国产成在线观看免费视频 | www.狠狠操.com| 99精品免费久久久久久久久 | 国产成人免费 | 免费毛片aaaaaa | 500部大龄熟乱视频 欧美日本三级 | 久精品视频在线 | 免费福利在线观看 | 亚洲精品国偷拍自产在线观看 | av综合 日韩| 欧美日韩国产综合网 | 99久热在线精品视频成人一区 | 在线视频手机国产 | 亚洲视频分类 | 免费在线观看av网站 | a级片韩国 | 91精彩视频 | 国产啊v在线观看 | 999久久久欧美日韩黑人 | 正在播放国产精品 | 99久久久久久久久久 | 国产精品久久嫩一区二区免费 | 色婷婷综合久久久久 | 九九在线视频免费观看 | 国产精品青青 | 色婷婷丁香 | 在线观看视频在线观看 | 国产无遮挡猛进猛出免费软件 | 中文在线8新资源库 | 亚洲理论电影网 | 久久精品韩国 | 97国产大学生情侣白嫩酒店 | 又爽又黄又无遮挡网站动态图 | 亚洲国产日韩精品 | 精品一区二区免费 | 久久久久久久久久亚洲精品 | 日韩精品一区二区三区电影 | 国产免费作爱视频 | 国产亚洲精品中文字幕 | 国内揄拍国产精品 | 久久久久久久久久久久国产精品 | 成人精品久久久 | 一区二区精品视频 | 综合网五月天 | 韩国精品视频在线观看 | 精品在线观看一区二区 | 久久五月婷婷丁香社区 | 夜夜骑日日操 | 亚洲国产精品传媒在线观看 | 麻豆超碰| 国产一级视屏 | 免费观看性生活大片 | 日韩在线免费观看视频 | 一级黄色毛片 | 日韩电影在线观看一区二区三区 | 99精品视频在线看 | 天天操天天干天天操天天干 | 成人动漫一区二区三区 | 干干夜夜 | 亚洲欧美日韩国产一区二区 | 亚洲天堂网视频在线观看 | 91激情在线视频 | 国产精品久久99综合免费观看尤物 | 插插插色综合 | 成人av免费在线看 | 国产视频精选在线 | www.久艹| 又色又爽又黄 | 国产日韩欧美在线观看 | 四虎在线免费观看视频 | 黄色一级免费网站 | 九9热这里真品2 | 人人爱夜夜操 | 波多野结衣在线播放一区 | 国产不卡免费视频 | 色婷婷久久一区二区 | 黄色91在线| 天天色天天爱天天射综合 | 欧美在线1区 | 99视频这里只有 | 午夜精品视频一区 | 国产成人久 | 久久久人人爽 | 五月婷综合 | 久久久麻豆精品一区二区 | 天天干天天干天天干天天干天天干天天干 | 欧美在线视频一区二区 | 国产成人黄色在线 | 天天干,夜夜爽 | 91视频中文字幕 | 天天干天天干天天操 | 一级成人免费视频 | 96久久精品 | 免费看片网址 | 亚洲欧美色婷婷 | 91网站在线视频 | 天天干,狠狠干 | 国产日韩欧美视频 | www黄免费| 国产精品麻豆视频 | 亚洲欧洲国产视频 | 中文字幕在线观看视频一区 | 日韩av中文字幕在线 | 亚洲精品国产精品国自产在线 | 丝袜美腿在线视频 | 久久午夜色播影院免费高清 | 91超在线| 黄色av免费看 | 97人人视频| 亚洲视频久久久 | 中文字幕免费高清 | 国产黄色成人av | 人人干免费 | 国产精品久久久久四虎 | 天天搞天天 | 色视频网页 | 日本色小说视频 | 久久免费视频在线观看6 | 亚洲美女在线国产 | 亚洲精选国产 | 国产在线观看不卡 | 国产色婷婷精品综合在线手机播放 | 香蕉精品在线观看 | 蜜臀久久99静品久久久久久 | 欧美精品久久久久性色 | 91精品成人 | 国产理伦在线 | 香蕉网站在线观看 | 黄色在线观看www | 日韩国产精品久久 | 国产免费久久精品 | 欧美激情在线网站 | 一级黄色片在线免费看 | a国产精品 | 在线观看一二三区 | 国产高清99 | 久久久久电影网站 | 99久久99视频 |