<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      理解WPF Stylet中Command="{s:Action 方法名}"的設計與實現

      前言

      Stylet是我最近很喜歡使用的一個WPF框架,它的很多設計都體現了約定優于配置的思想。因此你會發現使用它非常方便,幾乎不需要任何配置,開箱即用,只需知道它的一些約定即可。

      查看Samples中Hello這個例子,只要在xaml中這樣寫:

       <Button Command="{s:Action SayHello}">Say Hello</Button>
      

      然后你點擊這個按鈕,就會觸發對應ViewModel中的SayHello方法,使用起來非常簡單方便。這背后Stylet框架做了什么呢?讓我們揭開它的神秘面紗吧!!

      ActionExtension

      先來看看ActionExtension,它位于Stylet.Xaml命名空間:

      s:Action的第一階段是XAML解析,這個階段的核心任務是將XAML標記中的{s:Action SayHello}語法翻譯成CommandAction實例。這個過程由ActionExtension標記擴展類完成,它是整個命令綁定系統的入口點。

      當XAML解析器遇到{s:Action SayHello}時,會調用ActionExtension.ProvideValue方法:

      HandleDependencyObject方法根據目標屬性的類型進行分支處理:

      對于命令綁定場景,CreateCommandAction方法創建CommandAction實例:

      rootObject就是具有s:Action的頁面:

      View.ActionTarget

      現在我們已經找到了View,但是想要觸發的方法是在ViewModel上的,那么就要想辦法找到對應的ViewModelStylet中是通過View.ActionTarget這個附加屬性實現的。通過View.ActionTarget附加屬性將ViewModel注入到可視化樹中,使得后續階段能夠找到正確的命令執行目標。

      先來看看View.ActionTarget的定義,位置在命名空間Stylet.Xaml下的View類中:

      默認值:InitialActionTarget(一個特殊的標記對象)

      繼承性:FrameworkPropertyMetadataOptions.Inherits確保屬性值可以沿著可視化樹向下傳遞

      View.Model屬性被設置時,會觸發PropertyChangedCallback,通過ViewManager建立視圖和ViewModel的關聯。

      在將ViewViewModel關聯起來的時候,設置了當前ViewActionTarget為對應的ViewModel

      CommandAction

      CreateCommandAction方法中會返回一個CommandAction

      這里是在把當前這個Subject對象里的ActionTargetProperty的值‘拴’到 某個尚未顯式的目標屬性上,而且只讓它從源(Subject)流向目標,不會反向同步。

      這里的SubjectButton對象,為什么也能找到ActionTargetProperty這個屬性呢?

      由于ActionTargetProperty設置了FrameworkPropertyMetadataOptions.Inherits標志,這個屬性會自動沿著可視化樹向下傳播:

      Window (View.ActionTargetProperty)
      ├── UserControl (繼承Window的View.ActionTargetProperty)
      │   ├── Button (繼承UserControl的View.ActionTargetProperty)
      │   └── TextBox (繼承UserControl的View.ActionTargetProperty)
      └── Grid (繼承Window的View.ActionTargetProperty)
      

      但是現在還沒完成綁定,只是綁定的一端,還需要設置將這個屬性綁定到哪里。

      BindingOperations.SetBinding(this, targetProperty, multiBinding);ActionBasetargetProperty依賴屬性綁定到View.ActionTargetProperty

      你會發現現在并沒有綁定到ViewModel,只是View.ActionTargetProperty的默認值:

      由于targetProperty依賴屬性從nullView.InitialActionTarget也會觸發UpdateActionTarget,不過這一次不做任何處理,直接返回:

      當設置View.ActionTargetProperty的值為對應的ViewModel時:

      就又會觸發UpdateActionTarget方法,這一次拿到了對應的ViewModel

      拿到ViewModel上的方法:

      拿到是否可以執行對應命令的屬性:

      現在重點來關注一下這里:

       Expressions.ConstantExpression targetExpression = Expressions.Expression.Constant(newTarget);
       Expressions.MemberExpression propertyAccess = Expressions.Expression.Property(targetExpression, guardPropertyInfo);
       this.guardPropertyGetter = Expressions.Expression.Lambda<Func<bool>>(propertyAccess).Compile();
      

      這段代碼在運行時動態編譯一段表達式樹,生成一個無參、返回 bool的委托(Func<bool>),用來快速讀取某個對象的布爾型屬性值。

      第一行相當于就是使用這個newTarget對象,第二行就是訪問這個newTarget對象的CanSayHello屬性,相當于newTarget.CanSayHello

      Expression.Lambda<Func<bool>>將表達式樹包裝成一個無參Lambda表達式(形如 () => newTarget.CanSayHello)。

      .Compile()把表達式樹編譯成可執行IL ,生成一個靜態緩存的委托Func<bool>

      然后調用this.UpdateCanExecute();觸發CanExecuteChanged事件,就會執行CanExecute方法,在這個方法中就使用到了剛剛生成的獲取newTarget.CanSayHello屬性的委托:

      現在是false,命令無法執行:

      當我輸入小明的時候就修改了這個屬性值,就會觸發CanExecuteChanged事件:

      就又會調用剛剛生成的那個獲取newTarget.CanSayHello屬性的委托:

      這一次返回true,命令可以執行。

      當我點擊按鈕的時候,如果命令可以執行,就會執行Execute方法

      這樣就會執行ViewModel中對應的方法。

      以上就是個人對于WPF Stylet中Command="{s:Action SayHello}"的設計與實現的理解。

      posted @ 2025-09-23 09:04  mingupupup  閱讀(251)  評論(1)    收藏  舉報
      主站蜘蛛池模板: 精品日韩人妻中文字幕| 无码人妻斩一区二区三区| 蜜芽亚洲AV无码精品国产午夜 | 亚洲国产成人久久综合同性| 久久碰国产一区二区三区| 四虎成人精品无码| 不卡一区二区国产精品| 国产一级特黄性生活大片| 中文字幕在线日韩| 欧美成人aaa片一区国产精品| 日韩三级一区二区在线看| 久章草这里只有精品| 99久久国产精品无码| 色吊丝二区三区中文写幕| 免费超爽大片黄| 99精品国产一区二区三| 国产精品日日摸夜夜添夜夜添无码| 亚洲精品理论电影在线观看| 成人精品日韩专区在线观看| 最近中文字幕国产精品| 德昌县| 亚洲狠狠婷婷综合久久久| 伊人激情一区二区三区av| 亚洲中文字幕一区二区| 免费av深夜在线观看| 国产久免费热视频在线观看| 大地资源免费视频观看| 3d全彩无码啪啪本子全彩| 免费午夜无码片在线观看影院| 精品不卡一区二区三区| 婷婷六月色| 亚洲av无码乱码在线观看牲色| 一卡2卡三卡4卡免费网站| 成人综合人人爽一区二区| 亚洲欧美中文日韩在线v日本| 国产熟女激情一区二区三区| 无遮无挡爽爽免费视频| 亚洲综合精品第一页| 国精品91人妻无码一区二区三区| 国产亚洲精品AA片在线播放天| 国产欧美精品一区二区三区四区|