C# Xamarin 數據綁定入門基礎

      網友投稿 1069 2022-05-30

      目錄

      關于數據綁定

      視圖-視圖綁定

      綁定模式

      簡單的集合綁定

      C# Xamarin 數據綁定入門基礎

      關于數據綁定

      Xamarin 單向、雙向綁定

      Xaml綁定

      C#代碼綁定

      在此之前,幾段?偽代碼?幫助像我一樣菜的同學入門。。。

      假如說,有兩個控件,一個是滑動條(Slider),一個是顯示文本的標簽(Label)。

      Slider?slider?=?new?Slider() ????????????{ ????????????????Maximum?=?1, ????????????????Value?=?10 ????????????};????????????Label?label?=?new?Label();????????????label.Text?=?slider.Value.ToString();

      滑動條(Slider)滑動的最小單位是 1,初始化值是 10。

      我們想用標簽(Label)顯示滑動條的值,在代碼里可以直接賦值。

      label.Text?=?slider.Value.ToString();

      但是,這樣只能獲取一次值,我們想滑動條每次滑動,標簽動態顯示滑動條的值,這時候就需要綁定。

      方式1:

      Slider?slider?=?new?Slider() ????????????{ ????????????????Maximum?=?1, ????????????????Value?=?10 ????????????};????????????Label?label?=?new?Label();????????????label.Text?=?"666";?//?隨便初始化一個值 ????????????label.BindingContext?=?slider;??????//?與一個對象相關聯 ????????????//?設置一個綁定 ????????????//?將?Label?類型的?Text?與?slider?的?Value?屬性綁定起來????????????label.SetBinding(Label.TextProperty,"Value");

      方式2:

      Slider?slider?=?new?Slider() ????????????{ ????????????????Maximum?=?1, ????????????????Value?=?10 ????????????};????????????Label?label?=?new?Label();????????????label.Text?=?"666";?//?隨便初始化一個值 ????????????Binding?binding?=?new?Binding() ????????????{ ????????????????Source?=?slider,?//?關聯數據源 ????????????????Path?=?"Value"???//?綁定數據源的屬性 ????????????}; ????????????//?綁定????????????label.SetBinding(Label.TextProperty,?binding);

      上面里,有關鍵字需要記住

      BindingContext()、SetBinding()、Binding、Source、Path。

      視圖-視圖綁定

      視圖-視圖綁定,即 UI 控件間的綁定,使用 Xaml 代碼即可完成,不需要 C#代碼。

      上一節中,使用 偽代碼 來作為示范,顯示了兩種綁定方式,下面將以兩種方式為例,編寫 Xaml 代碼的綁定。

      首先,要建立數據源

      綁定數據使用?{Binding ... ...}

      然后按照第一種方式就行綁定

      x:Reference?是拓展標記,在 XAML 標記中其他地方聲明的實例的引用。 指明所引用的元素的?x:Name。就是一種固定格式,主要是里面的 Name,要填寫數據控件的?X:Name?屬性。

      {Binding Path=Value}?表明操作是 Binding ,即綁定數據,綁定的數據是 slider 的 Value 屬性。

      上面綁定方式,先在 BindingContext 屬性中綁定數據源對象,再在 Text 屬性中綁定 數據源對象 的 Value 屬性。

      第二種方式

      第二種方式,直接使用?{Binding ... ... }?綁定數據,Source 設置要綁定的數據源對象,Path 綁定了這個對象的某個屬性。

      為了讓界面好看一些,總結上面的代碼,寫成

      ???????? ???????? ???????? ???????? ???????? ????

      但是上面的小數點位數太多,不符合我們需要的格式,我們可以使用 StringFormat 對數據進行格式化。

      Text="{Binding?Path=Value,StringFormat='{0:F1}'}

      綁定模式

      綁定類型的BindingMode枚舉:

      Default

      OneWay?-值從源傳輸到目標

      OneWayToSource?-值從目標傳輸到源

      TwoWay?-值傳輸源和目標之間的這兩種方式

      OneTime-數據從源到目標進行,但僅當BindingContext發生更改時

      上面的的數據綁定,是一對一的,而且是單向的數據綁定,是先有 Slider 控件,再在 Label 中綁定。

      而且實際場景,1對1并且數據雙向影響、1對多并且多個數據源數據匯集到一個控件等。

      單個控件的不同屬性都可以綁定數據。 但是,每個控件只能有一個BindingContext,因此,在該視圖上的多個數據綁定必須全部引用同一對象的屬性。

      如果你使用上小節的第一種方式的話,那么只能綁定=一個對象和使用這個對象的屬性。

      如果使用第二種方法,則可以綁定多個數據源。

      根據之前的示例,假如 Label 的多個屬性,同時要綁定不同的數據,可以這樣寫。

      ???????? ???????????? ???????????? ???????????? ???????????? ???????????? ???????? ???????? ???????????? ???????????? ???????? ???????? ???????? ???????? ???????? ???????? ???????? ????

      C# Xamarin 數據綁定入門基礎

      上面的方法不太靈活,假設 Label 是公用的,要在 Label 里面配置多個屬性的數據來源,要通過自身編寫綁定,而且一個屬性只能綁定一個數據對象。

      為了降低耦合度,降低 Label 綁定數據的復雜程度,并且使得多個對象都可以修改 Label 的屬性。

      我們可以反過來,創建多個控件,Label 是數據源,其他控件是目標源,但是數據卻是從其他控件提供給 Label 的。有的繞,沒事,下面舉例說明。

      ???????? ???????? ???????? ???????? ????????

      label 不作任何處理,而 scaleSlider 和 rotationSlider 把 label 作為數據源綁定,從綁定的定義來說, label 是數據源, label 的屬性數據將 作為 目標控件 scaleSlider、 rotationSlider 的屬性值。

      咦?好像搞錯了,我們是要通過別的控件,去修改 label 的屬性值,怎么變成了用 label 的屬性值當作 此控件 的屬性值了?

      原因在于使用了 Mode 。

      OneWayToSource 枚舉:值從目標傳輸到源。

      從綁定的代碼和定義來說,label 是數據源,滑動條是目標,但是數據是反向流通的。

      示例代碼如下

      ???????? ???????????? ???????????? ???????????? ???????????? ???????????? ???????? ???????? ???????????? ???????????? ???????????? ???????????? ???????????? ???????? ???????? ???????? ???????? ????

      微軟官方文檔有一個示例代碼量比較多,有興趣可以參考一下

      ???? ???????? ???????????? ???????????? ???????????? ???????????? ???????????? ???????? ???????? ???????????? ???????????? ???????? ???????? ???????? ???????? ???????? ???????? ???????? ???????? ???????? ???????? ???????? ???????? ???????? ???????? ???????? ????

      簡單的集合綁定

      MainPage.xaml 里添加

      ????

      MainPage.xaml.cs 里,改成

      public?partial?class?MainPage?:?ContentPage ????{????????public?static?List?lists?=?new?List?{"a","b","c","d","e","f"?};????????public?MainPage()????????{ ????????????InitializeComponent(); ????????????lview.ItemsSource?=?lists; ????????} ????}

      運行后,會自動出現列表。

      關于 ListView ,后面的文章會更詳細地介紹。

      一個逗逗的大學生

      C#

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:深度剖析Kubernetes API Server三部曲 - part 2
      下一篇:移動端跨平臺方案淺析
      相關文章
      久久精品国产亚洲AV忘忧草18 | 亚洲综合色视频在线观看| 99热亚洲色精品国产88| 亚洲精品中文字幕乱码影院| 亚洲欧洲免费视频| 亚洲国产日韩一区高清在线| 亚洲短视频男人的影院| 中文字幕亚洲色图| 亚洲精品免费在线| 亚洲午夜电影在线观看高清 | 亚洲国产精品综合福利专区| 亚洲永久中文字幕在线| 亚洲大尺码专区影院| 亚洲人成免费电影| 亚洲人成未满十八禁网站| 亚洲精品国产suv一区88| 亚洲av日韩精品久久久久久a| 处破女第一次亚洲18分钟| 亚洲?V无码乱码国产精品| 国产成人精品曰本亚洲79ren| 亚洲综合无码精品一区二区三区| 亚洲熟妇丰满多毛XXXX| 久久亚洲精品AB无码播放| 久久久久亚洲AV成人片| 亚洲日韩中文字幕天堂不卡| 亚洲一区二区三区免费在线观看| 日本亚洲免费无线码 | 亚洲精品蜜夜内射| 国产亚洲美女精品久久久久| 亚洲无码日韩精品第一页| 亚洲色欲久久久综合网| 色婷婷六月亚洲婷婷丁香| 亚洲国产精品成人久久久| 久久亚洲国产成人影院| 国产亚洲欧美日韩亚洲中文色| 久99精品视频在线观看婷亚洲片国产一区一级在线 | 亚洲精品tv久久久久| 亚洲综合伊人久久综合| 亚洲视频在线观看一区| 国产成人精品日本亚洲11| 色噜噜噜噜亚洲第一|