C# WPF MVVM开发框架Caliburn.Micro 名称Transformer⑩①
使用名稱Transformer
NameTransformer是在Caliburn.Micro v1.1中引入的,它是ViewLocator和ViewModelLocator如何將類名映射到其伙伴角色的一個組成部分。雖然您可以覆蓋這些服務上的各種函數(shù)來替換底層行為,但您的大多數(shù)需求都應該通過使用適當?shù)腘ameTransformer配置規(guī)則來滿足,NameTransformer描述了您獨特的映射策略。
名稱轉換基于使用正則表達式模式匹配的規(guī)則。執(zhí)行轉換時,將按順序計算所有已注冊的規(guī)則。默認情況下,NameTransformer返回所有匹配規(guī)則生成的結果名稱。ViewLocator和ViewModelLocator類將使用結果名稱列表按順序檢查AssemblySource.Instance集合中是否存在匹配類型。找到類型后,將忽略列表中的其余名稱。盡管定位器類將始終最多返回一種類型,而不管NameTransformer返回的名稱數(shù)量如何,但能夠指定NameTransformer如何構造名稱列表以更好地控制將定位的類型是很重要的。控制的主要手段是通過順序。由于定位器類需要支持一些現(xiàn)成的類型命名約定,因此會自動添加一些默認名稱轉換規(guī)則。但是,為了能夠支持自定義規(guī)則并允許它們優(yōu)先于默認規(guī)則,NameTransformer按照與添加規(guī)則相反的順序(LIFO)對規(guī)則進行求值。通常,您希望在更具體的規(guī)則之后評估更一般的規(guī)則。因此,在向NameTransformer添加規(guī)則時,必須首先添加更一般的規(guī)則,最后添加更具體的規(guī)則。要將NameTransformer返回的名稱限制為第一個匹配規(guī)則生成的名稱,可以將NameTransformer上的UseGuardRuleSelection屬性設置為false。默認情況下,UseGuardRuleSelection設置為true。
自定義規(guī)則是通過調用ViewLocator和ViewModelLocator類維護的NameTransformer對象的AddRule()方法添加的。兩個類都引用各自的NameTransformer靜態(tài)實例,因此每個類都維護自己的一組規(guī)則。
呼叫約定如下:
public void AddRule(string replacePattern, IEnumerable<string> replaceValueList, string globalFilterPattern = null)replacePattern:用于替換全部或部分輸入字符串的正則表達式模式
replaceValueList:應用于replacePattern的字符串集合
globalFilterPattern:用于確定是否應計算規(guī)則的正則表達式模式。可選擇的
public void AddRule(string replacePattern, string replaceValue, string globalFilterPattern = null)replacePattern:用于替換全部或部分輸入字符串的正則表達式模式
replaceValue:應用于replacePattern的字符串
globalFilterPattern:用于確定是否應計算規(guī)則的正則表達式模式??蛇x擇的
為了說明如何使用此方法,我們可以查看ViewLocator類添加的一個內(nèi)置規(guī)則:
NameTransformer.AddRule("Model$", string.Empty);此轉換規(guī)則查找終止ViewModel名稱的子字符串“Model”,并去掉該子字符串(即替換為string.Empty或“null string”)。第一個參數(shù)中的“$”表示模式必須在源字符串的末尾匹配。如果“模型”存在于其他任何地方,則模式不匹配。由于此調用未包含可選的“globalFilterPattern”參數(shù),因此此規(guī)則適用于所有ViewModel名稱。
此規(guī)則產(chǎn)生以下結果:
ViewModelLocator添加的相應內(nèi)置規(guī)則為:
NameTransformer.AddRule(@"(?<fullname>^.*$)", @"${fullname}Model");這個規(guī)則接受任何輸入,并在末尾添加“Model”。此規(guī)則使用正則表達式捕獲組,這在復雜轉換中非常有用?!皉eplacePattern”將視圖的全名分配給名為“fullname”的捕獲組,“replaceValue”將其轉換為“Model”。
為了演示“globalFilterPattern”是如何應用的,我們可以看看ViewModelLocator的另外兩個內(nèi)置規(guī)則:
//Check for <Namespace>.<BaseName>View construct NameTransformer.AddRule(@"(?<namespace>(.*\.)*)(?<basename>[A-Za-z_]\w*)(?<suffix>View$)",new[] {@"${namespace}${basename}ViewModel",@"${namespace}${basename}",@"${namespace}I${basename}ViewModel",@"${namespace}I${basename}"},@"(.*\.)*[A-Za-z_]\w*View$");//Check for <Namespace>.Views.<BaseName>View construct NameTransformer.AddRule(@"(?<namespace>(.*\.)*)Views\.(?<basename>[A-Za-z_]\w*)(?<suffix>View$)",new[] {@"${namespace}ViewModels.${basename}ViewModel",@"${namespace}ViewModels.${basename}",@"${namespace}ViewModels.I${basename}ViewModel",@"${namespace}ViewModels.I${basename}"},@"(.*\.)*Views\.[A-Za-z_]\w*View$");這兩個調用的“globalFilterPattern”參數(shù)相同,只是在第二個方法調用的參數(shù)中添加了“Views.”。這表示僅當名稱空間名稱以“視圖”(包括點)結尾時,才應應用該規(guī)則。如果模式匹配,則結果是ViewModel名稱的數(shù)組,其命名空間以“ViewModels”結尾。
第一條規(guī)則回顯原始名稱空間不變,將涵蓋所有其他情況。如前所述,首先添加最不特定的規(guī)則。它涵蓋了當名稱空間不以“視圖”結尾時的失敗情況。
當添加自定義的特定于應用程序的轉換規(guī)則時,下面的替換模式應該非常有用。替換模式采用完全限定的ViewModel名稱,并將其分成捕獲組,這些捕獲組應涵蓋幾乎所有轉換:
(?<nsfull>((?<nsroot>[A-Za-z_]\w*\.)(?<nsstem>([A-Za-z_]\w*\.)*))?(?<nsleaf>[A-Za-z_]\w*\.))?(?<basename>[A-Za-z_]\w*)(?<suffix>ViewModel$)例如,添加以下規(guī)則:
ViewLocator.NameTransformer.AddRule (@"(?<nsfull>((?<nsroot>[A-Za-z_]\w*\.)(?<nsstem>([A-Za-z_]\w*\.)*))?(?<nsleaf>[A-Za-z_]\w*\.))?(?<basename>[A-Za-z_]\w*)(?<suffix>ViewModel$)",@"nsfull=${nsfull}, nsroot=${nsroot}, nsstem=${nsstem}, nsleaf=${nsleaf}, basename=${basename}, suffix=${suffix}" );將產(chǎn)生以下結果:
筆記:
通過將“ViewModel$”更改為“View$”,上述相同的替換模式可用于ViewModelLocator。
您永遠不會像上面的例子那樣構造replace值,因為它會產(chǎn)生非法的類型名。它只是一個replace值,它將回顯所有捕獲組以供演示。
您可能會注意到,捕獲組并不是相互排斥的。捕獲組可以如示例中所示進行嵌套,以便“nsfull”捕獲完整名稱空間,“nsroot”、“nsstem”和“nsleaf”捕獲該名稱空間的各個組件。如果需要“交換”任何一個單獨的組件,則可以使用單獨的組件。
上面示例中的捕獲組“后綴”對以“ViewModels”結尾的名稱進行模式匹配。此捕獲組的主要目的不是將其用作轉換的一部分,因為ViewLocator的目的是解析視圖名稱。使用此捕獲組的主要原因是防止子字符串“ViewModels”在“basename”組中被捕獲,在大多數(shù)情況下,這是字符串轉換的一部分。
02
—
最后
原文標題:Caliburn.Micro Xaml made easy
原文鏈接:https://caliburnmicro.com/documentation/name-transformer
翻譯:dotnet編程大全
C#技術群?:?添加小編微信mm1552923,備注:進群!
總結
以上是生活随笔為你收集整理的C# WPF MVVM开发框架Caliburn.Micro 名称Transformer⑩①的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我的开源故事
- 下一篇: C# WPF MVVM开发框架Calib