現在是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#代碼就能出色的完成綁定任務!
好了,強迫症犯了。之幾種情形見下一篇博文。