[uwp開發]數據綁定那些事(1)


現在是msp候選人,是時候寫點技術博客來加分了(實則是個人的心得體會)。

注:以下都是個人理解,錯誤在所難免,歡迎批評指正

以前接觸過WPF,只會簡單的一些操作,現在在逐漸學習UWP(Universal Windows Platform)開發,當然也接觸過WP8.1的開發。總之他們都挺像的,直觀感受就是:XAML+CS(當然c++,vb之類的也行)。在這之中有個非常厲害的技術——數據綁定(DataBind)。既然是綁定,就是在兩(多)個對象之間,按照某種規則,建立起來一種聯系,聯系的內容就是數據。

學習數據綁定先大概了解兩個概念:

  1.數據源:提供數據的地兒

  2.綁定目標:接受綁定的對象

 

現在把常用情形分類指出:

一.兩個控件之間的綁定:

  最常用的例子,把一個文本框的內容顯示(或者實時顯示)在一個標簽中,又或者通過一復選框來控制一個控件的可見性(Visibility),這兒還會引出一個值轉換器(Converter)的概念.

  下面就針對這兩種實際情況給出示例代碼。

 

  DEMO1:把一個文本框的內容顯示(或者實時顯示)在一個標簽中,

<TextBox x:Name="tbInput"></TextBox>
<TextBlock x:Name="tbOutput" Text="{Binding ElementName=tbInput,Path=Text,Mode=OneWay }"></TextBlock>

  這種綁定只需要在XAML中設置綁定關系即可。簡單易用。  

      分析一下:第一個TextBox是數據源,TextBlock是綁定目標,因為我們是把TextBox的Text屬性綁定到TextBlock的Text屬性上,所以需要在TextBlock的Text屬性上設置綁定,

       語法如上面代碼第二行所示,

       ElementName:數據源的名稱(Name屬性)

       Path:指明數據源的具體屬性

       Mode:是一個枚舉值,有OneTime,OneWay,TwoWay三種方式,分別表示綁定一次,單向綁定,雙向綁定。其中單向是指綁定目標的數據受數據源影響,但不影響數據源;

          雙向是指數據源和綁定目標互相影響,其中一個變了,另一個也跟着變。

 

 

  DEOM2:通過一復選框來控制一個控件的可見性(Visibility)

<Page.Resources>
  <local:DataConverter x:Key="converter"></local:DataConverter> </Page.Resources>

 

<CheckBox x:Name="cbState" IsChecked="True"></CheckBox>
<TextBlock x:Name="tbInfo" Visibility="{Binding Path=IsChecked,ElementName=cbState, Mode=OneWay,Converter={StaticResource ResourceKey=converter}}">你能看見我嗎</TextBlock>

 

值轉換器代碼:

public class DataConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, string language)
        {
            bool? ischeched = value as bool?;
            if (ischeched == null || ischeched == false)
            {
                return Visibility.Collapsed;
            }
            else
            {
                return Visibility.Visible;
            }
        }

        public object ConvertBack(object value, Type targetType, object parameter, string language)
        {
            throw new NotImplementedException();
        }
    }

      這第二個實例的代碼看着有些煩,但是仔細理解還是很簡單的。

      先來分析一下需求:

        當CheckBox的IsChecked屬性為True時,TextBlock的Visibilty屬性為Visible;

        當CheckBox的IsChecked屬性為False時,TextBlock的Visibilty屬性為Collapsed.

      即True對應Visiblle,Flase對應Collapsed,如果按照我們之前Demo1的寫法,應該是

      Visibility="{Binding Path=IsChecked,ElementName=cbState, Mode=OneWay}"

      但是這么寫后會發現運行后無效果,因為系統根本就不知道CheckBox的IsChecked屬性和TextBlock的Visilibity屬性之間有什么對應關系,

      而值轉換器(ValueConverter)就是提供這種對應關系的東西。

 

      之前的DEMOE1中不需要我們顯示指定一個值轉換器,因為他們的Text屬性都是string類型,類型一致,系統就會自動幫我們完成值轉換的工作!

                 但是我們的Demo2就不行了,系統猜不出來我們到底是怎么完成對應關系的,需要我們自己動手寫!

 

      代碼如上,我們定義一個類DataConverter,讓他繼承自IValueConverter,這個接口定義了兩個方法

        Convert是從數據源到綁定目標的轉換;

        ConvertBack是從綁定目標到綁定源的轉換(在這個demo中我們是單向綁定,所以不需要實現這個接口,讓它保持默認情況即可,但是不能吧這個方法刪掉,這樣編譯會報錯,原因你應該懂)

      在Convert方法中,

          value代表需要被轉換的值,在我們的這個demo中,他可能為True,False,null

          targetType代表最終需要的數據得類型,這個demo中是Visibilty枚舉類型!

      然后我們在Convert中根據value的類型,返回相應的Visibilty枚舉值即可!

 

  綜上,Demo1和Demo2都很簡單,都是兩個系統控件之間的綁定。他們只需要我們手寫很少的c#代碼就能出色的完成綁定任務!

  好了,強迫症犯了。之幾種情形見下一篇博文。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM