WPF技巧(1)非同步繫結

weixin_34402090發表於2010-04-26

    與大家共勉

當屬性值填充好後,與該屬性繫結的介面才會開始載入(屬性繫結優於控制元件載入)


這個技巧很簡單,但卻影響著執行的速度.以下為測試

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" />

 

說實話我也剛剛知道有這麼一個屬性,這個屬性幾乎被我們忽略,平時用到很少,因為我們第一思維就是自己非同步去載入資料,學了一招

相關文章