win8/Metro开发系列二 Xaml数据绑定
首先還是那句話,我不是大牛,這些只是簡單的記錄一下學習的過程,沒有太多面向對象和設計模式的思維,只偏基礎,不喜莫笑;個人觀點如果有不足之處,還望多多指教!由于學的不是太深入這里大多數是面向控件和開發介紹;以使快速了解和開發
知道了怎么布局還得會把程序的數據綁定顯示出來,這樣才能完成整個程序!!
這節就來一起交流下win8 metro應用的簡單的一些數據綁定,不涉及設計模式和面向對象;
其實基本的綁定和web 開發和winfrom開發感覺沒什么太大的區別
提到數據綁定要介紹一個綁定模式
OneTime:一次綁定,綁定創建時使用源數據更新控件。(可以是普通的set、get屬性)。
OneWay (默認值):單向綁定,在綁定創建時使用源數據更新控件,當源數據發生變化的時候也更新控件。(必須實現INotifyPropertyChanged接口或者繼承自DependencyObject)。相當于Eval
TwoWay:雙向綁定,數據源的變化會更新控件,控件的變化也會更新到數據源。相當于Bind吧(呵呵我做東西是沒怎么用到這個)
1.微軟提供的綁定,可以做到數據源變化界面自動跟著數據源一起發生辯護,如果雙向更可以做到界面變化數據源同時也跟著變下,也不用轉換很方面,微軟內部實現好了。
<TextBox?Text=”{Binding?Path=UserName}”/><TextBox?Text="{Binding?ElementName=sliderOneTimeDataSource,?Path=Value,?Mode=OneTime}"?…/> 以上代碼中,第一行通過使用Binding標記擴展的Path屬性將UserName綁定到元素對象TextBox的Text依賴屬性中,使文本內容在運行時動態顯示到客戶端 而第二行代碼使用Binding標記擴展中EelementBinding(對象元素綁定)功能,綁定對象sliderOneTimeDataSource.Value到TextBox的Text屬性中,使文本內容在滑動條內容改變時,TextBox內容同步改變。? 2.把model數據源賦值DataContext 數據上下文對象 可以把數據源,賦給控件的dataContext對象,控件有了數據源就可以像上面那樣綁定 {Binding?數據源的屬性} 綁定到需要的之上 注意:1.binding相當于DataContext,如果使用集合數據源控件如ListViewer等這他的數據源要賦給 dataItemSource然后再綁定;當然如果你不嫌麻煩完全可以這樣ListViewer.DataContext=list; 然后再xaml中在dataItemSource="{Binding}"2.數據上下文綁定后 子空間共享父控件大數據上下文,當然子控件如果單獨定義了data這優先級這個就不用說了大家都懂;這個和路由事件的冒泡相反冒泡對外吐它向下去; 如果不指定路徑,則表示值綁定到DataContext的值 也可以通過ElementName來按照帶name的元素設定綁定源,但是不會影響其他屬性,也不會繼承給子元素。 3.如果需要數據源變控件跟著改變則注意(必須實現INotifyPropertyChanged接口或者繼承自DependencyObject).來給數據源一個事件,控件監聽這個事件來獲知變化進行重新綁定,(metro不支持DependencyObject)silverlight wpf wp7 在編輯器中點擊右鍵→插入代碼段→NETFX30→定義一個DependencyProperty依賴屬性,而metro廢棄了依賴屬性的事件通知INotifyPropertyChanged所以老老實實用它吧 4.如果是集合的話泛型集合也不行也得實現INotifyPropertyChanged4,數據綁定的Converter
之前文本框的Text屬性是string類型,也能雙向綁定,這是因為有值轉換器。 比如想把Model中的true,false綁定的到ProgressBar的Visibility屬性上就需要他了先需要定義轉換器類,轉換器要實現IValueConverter接口,很簡單一個回去的一個綁定的就是名字嚇人點其實就是類型轉換
示例代碼:
Book book = new Book();book.Name = "比科員";book.Price = 30;this.DataContext = book;<TextBlock Height="23" HorizontalAlignment="Left" Margin="26,12,0,0" Name="textBlock1" Text="{Binding Name}" VerticalAlignment="Top" /><TextBox Height="23" HorizontalAlignment="Left" Margin="99,12,0,0" Name="textBox1" VerticalAlignment="Top" Width="120" Text="{Binding Price}" />?
扯了半天太抽象還是看例子吧效果
2.
<ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Hidden"><ListView x:Name="dataListView" ItemClick="OnItemCilck" IsItemClickEnabled="True" SelectionChanged="dataListView_SelectionChanged" ><ListView.ItemTemplate><DataTemplate><StackPanel Orientation="Vertical" Width="300" Height="200"><Rectangle Height="3" Width="9" Fill="Red"></Rectangle><Rectangle Height="1" Width="300" Fill="Red"></Rectangle><TextBlock x:Name="title" Text="{Binding title, Mode=TwoWay}" TextWrapping="Wrap" FontSize="30"></TextBlock><TextBlock Visibility="Collapsed" x:Name="body" TextWrapping="Wrap" Text="{Binding body, Mode=TwoWay}"></TextBlock></StackPanel></DataTemplate></ListView.ItemTemplate><ListView.ItemsPanel><ItemsPanelTemplate><WrapGrid Orientation="Vertical" MaximumRowsOrColumns="3"></WrapGrid></ItemsPanelTemplate></ListView.ItemsPanel></ListView></ScrollViewer>后臺代碼就一句:
this.dataListView.ItemsSource = this.o;如果要想雙向通知如
如如果內容太多或者從網絡資源加載過來的話想加載一部分先顯示出來,或者點擊按鈕再顯示一部分的話這是就得把list集合實現INotifyPropertyChanged
不過還有個比較生省事的解決方法就是ObservableCollection這個泛型集合微軟給我們實現了INotifyPropertyChanged事件我們可以拿來直接應用,而且他實現了IList和list的用法基本一樣很好用,這樣讓你的程序更加人性化
?
總結
以上是生活随笔為你收集整理的win8/Metro开发系列二 Xaml数据绑定的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win8和win8.1动态绑定数据到Li
- 下一篇: FlipView和自定义值转换器