與大家共勉
當屬性值填充好後,與該屬性繫結的介面才會開始載入(屬性繫結優於控制元件載入)
這個技巧很簡單,但卻影響著執行的速度.以下為測試
1.定義一個集合屬性
private IList<string> _list; public IList<string> List { get { if (_list == null) { _list = new List<string>(); for (int i = 0; i < 100; i++) { _list.Add("item" + i); } } return _list; } }
2.繫結屬性
<Window x:Class="WpfRecipe1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:WpfRecipe1" Title="MainWindow" Height="350" Width="525"> <Grid> <ListBox ItemsSource="{Binding List,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type local:MainWindow}}}" Height="179" HorizontalAlignment="Left" Margin="76,31,0,0" Name="listBox1" VerticalAlignment="Top" Width="135" /> </Grid> </Window>
上面的程式碼可以很好的執行.
事實上我們取資料都沒這麼簡單,假設這段資料是從資料裡取的,花費3秒時間,我們以執行緒模擬
private IList<string> _list; public IList<string> List { get { System.Threading.Thread.Sleep(3000); //省略程式碼
return _list; } }
下面重新執行程式碼,你將會發現程式會先停滯三秒.結論在剛開始已經提到
即使下面的程式碼也是遵循上面的原則
<TabControl> <TabItem Header="tab1"></TabItem> <TabItem Header="tab2"> <ListBox ItemsSource="{Binding List,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type local:MainWindow}}}" Height="179" HorizontalAlignment="Left" Margin="76,31,0,0" Name="listBox1" VerticalAlignment="Top" Width="135" /> </TabItem> </TabControl>
這是相當鬱悶的一段程式碼,因為使用者什麼也沒看到,卻讓使用者等了三分鐘.
首先想到的是自己非同步取資料,其實還有一個更簡單的方法就是在繫結時將IsAsync設定為True
<ListBox ItemsSource="{Binding List, IsAsync=True, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type local:MainWindow}}}" Height="179" HorizontalAlignment="Left" Margin="76,31,0,0" Name="listBox1" VerticalAlignment="Top" Width="135" />
說實話我也剛剛知道有這麼一個屬性,這個屬性幾乎被我們忽略,平時用到很少,因為我們第一思維就是自己非同步去載入資料,學了一招