win10 uwp DataContext
本文告訴大家DataContext的多種綁法。
適合于WPF的綁定和UWP的綁定。
我告訴大家很多個方法,所有的方法都有自己的優(yōu)點和缺點,可以依靠自己喜歡的用法使用。當(dāng)然,可以在新手面前秀下,一個頁面一個綁定方法。
開始是從最簡單的來說起。
資源綁定
最簡單的綁定是寫在資源。
<Page.Resources><viewModel:ViewModel x:Key="ViewModel"></viewModel:ViewModel></Page.Resources>這時就可以在Grid綁定,當(dāng)然缺點就是 后臺代碼無法直接使用,需要經(jīng)過轉(zhuǎn)換才可以使用。
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"DataContext="{StaticResource ViewModel}"></Grid>因為很多WPF程序都是把界面放在 Window 而不是放在頁,所以為了在 UWP 和WPF使用的都是相同。可以用 FrameworkElement 代替 Page 。因為所有控件幾乎都繼承于 FrameworkElement 于是在頁面任何地方都可以放這句話,不需要多余修改。所以剛才的 Page.Resources 就可以修改為 FrameworkElement.Resources
可是這個方法有個缺點,無法在頁面 Page 元素上使用 DataContext 綁定,只能在 資源后面的 Grid 使用。因為資源是有順序,Page 在資源之前,于是 Page 就無法綁定。在WPF的也一樣。提示的錯誤參見下圖。
如果只有一個頁面,而且使用的地方也是在 頁面的內(nèi)容,那么建議使用這個方法。
如果需要在 Page 的元素也綁定到 ViewModel ,那么可以參見下面的方法。
app 資源綁定
另一個方法是把他寫到 app ,代碼就是
<Application.Resources><viewModel:ViewModel x:Key="ViewModel"></viewModel:ViewModel></Application.Resources>這樣在程序任何地方都可以使用
我的想法,如果是 ViewModel ,那么寫在這里,對于 MVVM 的 ViewModel ,MainPage 對應(yīng)的 ViewModel 建議寫在這里。
如果寫在這,代碼使用 (ViewModel) App.Current.Resources["ViewModel"] 就可以獲得,也就是在任意的代碼都可以使用這個方法獲得。參見:win10 uwp 后臺獲取資源
這個方法的優(yōu)點:
在程序運(yùn)行時都可以得到 ViewModel ,這是這方法適合的地方。
當(dāng)然缺點是,如果你寫了很多個 ViewModel 在資源,在程序運(yùn)行都會占內(nèi)存,也不會釋放,所以一般建議只寫ViewModel ,不要寫多個。
DataContext 新建資源
如果對于一個 ViewModel 只有一個頁面使用,那么可以不需要寫在 App ,因為這樣會讓其它的頁面都可以訪問
遇到上面的需要,只有一個頁面需要 ViewModel ,可以直接寫
<Page.DataContext><vm:ViewModel></vm:ViewModel></Page.DataContext>這個方法可以讓ViewModel和頁面都在一個時間,也就是關(guān)閉了頁面,也就自動關(guān)了 ViewModel ,說了這么多,好像還沒說如何在代碼使用 viewModel 。上面的所有方法在代碼使用 ViewModel 都相同。
后臺代碼獲得資源
先定義屬性 ViewModel ,然后在 構(gòu)造寫從 DataContext 轉(zhuǎn)換。記得寫構(gòu)造函數(shù)的最后,在 InitializeComponent 的后面。
public sealed partial class MainPage : Page{public MainPage(){this.InitializeComponent();ViewModel = (ViewModel) DataContext; //這是 cast 方法,直接轉(zhuǎn)換,不要使用 as 的方法。}private ViewModel ViewModel { set; get; }}為何需要把 ViewModel 轉(zhuǎn)換寫在最后,我就不繼續(xù)解釋。
關(guān)于為何使用 cast 而不是 as ,因為已經(jīng)確定了現(xiàn)在使用的類型就是 ViewModel ,我也需要使用的是 ViewModel 不是其他,如果有人改了其它的類型,我必須報錯,于是就使用 cast ,如果使用了 Cast 那么看日志比較容易看到是那里寫錯。
代碼定義資源
代碼綁定
除了在 xaml 定義DataContext,一個常用方法是在 代碼定義
public MainPage(){ViewModel = new ViewModel();this.InitializeComponent();DataContext = ViewModel;}private ViewModel ViewModel{set; get;}這個方法也是推薦的,可以在代碼定義,但是這樣在 xaml 寫 binding 就不會有提示。
如果只在代碼寫新建 ViewModel ,不定義 DataContext ,把他寫在 xaml ,那么就可以獲得提示。
代碼定義,xaml綁定
這里的 提示 指的是,在 xaml 輸入的時候,寫一個變量不需要完全自己寫。和后臺代碼一樣,會提示這個變量,自動給你選。沒有提示容易寫錯代碼,而且變量改名了,xaml不會隨著改。
public MainPage(){ViewModel = new ViewModel();this.InitializeComponent();}private ViewModel ViewModel{set; get;} DataContext="{Binding RelativeSource={RelativeSource Self},Path=ViewModel}"這句代碼是寫在 Page ,如果寫在其他的 Grid 得到就不會有 ViewModel 。
大概就是所有的可以定義 DataContext 的方法。
如果你還有新的方法,歡迎討論。
本作品采用知識共享署名-非商業(yè)性使用-相同方式共享 4.0 國際許可協(xié)議進(jìn)行許可。歡迎轉(zhuǎn)載、使用、重新發(fā)布,但務(wù)必保留文章署名林德熙(包含鏈接:http://blog.csdn.net/lindexi_gd ),不得用于商業(yè)目的,基于本文修改后的作品務(wù)必以相同的許可發(fā)布。如有任何疑問,請與我聯(lián)系。
轉(zhuǎn)載于:https://www.cnblogs.com/lindexi/p/7694359.html
總結(jié)
以上是生活随笔為你收集整理的win10 uwp DataContext的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BZOJ 1666 USACO 2006
- 下一篇: PHP中几种加密形式