wpf繫結全域性靜態變數(mvvm)
在實際的開發中,有一些集合或者屬性可能是全域性的,比如當你做一個oa的時候,可能需要展示所有的人員,這時這個所有的人員列表顯然可以作為全域性引數,比如這裡有一個全域性的靜態屬性UserList。而你在使用mvvm做wpf開發的時候,一般每個view都已經指定好了viewmodel。而viewmodel顯然是不包含UserList。這時如果你想在綁定了viewmodel裡面繫結UserList給某個ListBox該怎麼辦呢。首先你可以在你的viewmodel裡面定義一個UserList指向全域性靜態變數的引用,就像下面這樣:
public List<User> UserList{ get=>return Global.UserList; }
這是一個方法,但這個方法會讓你的viewmodel變得臃腫。實際上wpf是支援靜態引數的繫結的,在xaml裡面這樣寫:
ItemsSource="{Binding Source={x:Static local:GlobalData.UserList}}"
或者ItemsSource="{x:Static local:GlobalData.UserList}"
這樣,當你的任何一個模組,改變了UserList裡面的東西,所有前端用到這個列表的,都會收到屬性變更通知。
再比如,你要在某個件上繫結System.DateTime.Now,則這麼寫:
<TextBlock Grid.Row="1" Text="{Binding Source={x:Static system:DateTime.Now},StringFormat='yyyy-MM-dd HH:mm:ss '}"/>
當然,要定義一下system:
xmlns:system="clr-namespace:System;assembly=mscorlib"。
事實上這種繫結是無意義的,因為Now只是普通的屬性,並沒有實現屬性變更通知,因此你的textblock顯示的時間不過是第一次載入的時間。它並不會隨著時間的變化而變化。
這裡面,source的作用其實就是指定源,通常我們繫結,只需要設定path,比如path=Name或者直接繫結某個屬性,比如Text="{Binding Name}",這樣系統會自動從你設定的DataContext裡面找Name這個屬性。而如果你指定了Source,系統便不會在你的DataContext裡面查詢,而是從指定的Source裡面查詢。因此,假設你的GlobalData裡面有一個靜態實體(Model),它裡面有一個UserList,那麼你應該這麼寫:
ItemsSource="{Binding UserList, Source={x:Static local:GlobalData.Model}}"
---------------------
作者:returnTrue999
來源:CSDN
原文:https://blog.csdn.net/dap769815768/article/details/82149363
版權宣告:本文為博主原創文章,轉載請附上博文連結!