天天看點

win10 uwp DataContext

本文告訴大家DataContext的多種綁法。

适合于WPF的綁定和UWP的綁定。

我告訴大家很多個方法,所有的方法都有自己的優點和缺點,可以依靠自己喜歡的用法使用。當然,可以在新手面前秀下,一個頁面一個綁定方法。

開始是從最簡單的來說起。

資源綁定

最簡單的綁定是寫在資源。

<Page.Resources>
        <viewModel:ViewModel x:Key="ViewModel"></viewModel:ViewModel>
    </Page.Resources>           

這時就可以在Grid綁定,當然缺點就是 背景代碼無法直接使用,需要經過轉換才可以使用。

<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的也一樣。提示的錯誤參見下圖。

如果隻有一個頁面,而且使用的地方也是在 頁面的内容,那麼建議使用這個方法。

如果需要在 Page 的元素也綁定到 ViewModel ,那麼可以參見下面的方法。

app 資源綁定

另一個方法是把他寫到 app ,代碼就是

<Application.Resources>
        <viewModel:ViewModel x:Key="ViewModel"></viewModel:ViewModel>
    </Application.Resources>           

這樣在程式任何地方都可以使用

我的想法,如果是 ViewModel ,那麼寫在這裡,對于 MVVM 的 ViewModel ,MainPage 對應的 ViewModel 建議寫在這裡。

如果寫在這,代碼使用

(ViewModel) App.Current.Resources["ViewModel"]

就可以獲得,也就是在任意的代碼都可以使用這個方法獲得。參見:win10 uwp 背景擷取資源

這個方法的優點:

在程式運作時都可以得到 ViewModel ,這是這方法适合的地方。

當然缺點是,如果你寫了很多個 ViewModel 在資源,在程式運作都會占記憶體,也不會釋放,是以一般建議隻寫ViewModel ,不要寫多個。

DataContext 建立資源

如果對于一個 ViewModel 隻有一個頁面使用,那麼可以不需要寫在 App ,因為這樣會讓其它的頁面都可以通路

遇到上面的需要,隻有一個頁面需要 ViewModel ,可以直接寫

<Page.DataContext>
        <vm:ViewModel></vm:ViewModel>
    </Page.DataContext>           

這個方法可以讓ViewModel和頁面都在一個時間,也就是關閉了頁面,也就自動關了 ViewModel ,說了這麼多,好像還沒說如何在代碼使用 viewModel 。上面的所有方法在代碼使用 ViewModel 都相同。

背景代碼獲得資源

先定義屬性 ViewModel ,然後在 構造寫從 DataContext 轉換。記得寫構造函數的最後,在 InitializeComponent 的後面。

public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();
            ViewModel = (ViewModel) DataContext; //這是 cast 方法,直接轉換,不要使用 as 的方法。
        }

        private ViewModel ViewModel { set; get; }
    }           

為何需要把 ViewModel 轉換寫在最後,我就不繼續解釋。

關于為何使用 cast 而不是 as ,因為已經确定了現在使用的類型就是 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 的方法。

如果你還有新的方法,歡迎讨論。

win10 uwp DataContext

本作品采用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協定進行許可。歡迎轉載、使用、重新釋出,但務必保留文章署名林德熙(包含連結:http://blog.csdn.net/lindexi_gd ),不得用于商業目的,基于本文修改後的作品務必以相同的許可釋出。如有任何疑問,請與我聯系。

部落格園部落格隻做備份,部落格釋出就不再更新,如果想看最新部落格,請到 https://blog.lindexi.com/

win10 uwp DataContext

本作品采用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協定進行許可。歡迎轉載、使用、重新釋出,但務必保留文章署名[林德熙](http://blog.csdn.net/lindexi_gd)(包含連結:http://blog.csdn.net/lindexi_gd ),不得用于商業目的,基于本文修改後的作品務必以相同的許可釋出。如有任何疑問,請與我[聯系](mailto:[email protected])。