1. 程式人生 > >WPF中的binding(五)- 使用DataTable作為Binding的源

WPF中的binding(五)- 使用DataTable作為Binding的源

一、DataTable的DefaultView屬性賦值給ListBox等派生自ItemsControl類的物件。

XAML檔案如下,我們設定ListBox的DisplayMemberPath為Name,這樣會在ListBox的列表中顯示DataTable對應的Name列:

<Window x:Class="_6_18.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <ListBox Height="208" HorizontalAlignment="Left" Margin="12,12,0,0" Name="listBox1" VerticalAlignment="Top" Width="479" 
                 DisplayMemberPath="Name"/>
    </Grid>
</Window>

然後,我們新建一個DataTable物件,並將該物件的DefaultView賦值給ListBox物件的ItemsSource。
public MainWindow()
 {
            InitializeComponent();

            DataTable dt = new DataTable();

            DataColumn id = new DataColumn("ID");
            DataColumn name = new DataColumn("Name");
            dt.Columns.Add(id);
            dt.Columns.Add(name);

            DataRow row1 = dt.NewRow();
            row1["ID"] = "1";
            row1["Name"] = "張?三¨y";
            dt.Rows.Add(row1);

            DataRow row2 = dt.NewRow();
            row2["ID"] = "2";
            row2["Name"] = "李¤?四?";
            dt.Rows.Add(row2);

            DataRow row3 = dt.NewRow();
            row3["ID"] = "3";
            row3["Name"] = "王ª?五?";
            dt.Rows.Add(row3);

           this.listBox1.ItemsSource = dt.DefaultView;

}
執行效果如下:

這裡,最重要的一句程式碼是 this.listBox1.ItemsSource = dt.DefaultView;DataTable的DefaultView屬性是一個DataView物件,DataView型別實現了IEnumberable介面,可以被賦值給ListBox的ItemsSource屬性。




二、DataTable的DefaultView屬性賦值給ListView的View屬性。

XAML檔案程式碼如下:

<Window x:Class="_6_18.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <ListView Height="147" HorizontalAlignment="Left" Margin="12,12,0,0" Name="listBox1" VerticalAlignment="Top" Width="479" 
                 >
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="ID" DisplayMemberBinding="{Binding ID}"/>
                    <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}"/>
                </GridView>
            </ListView.View>
        </ListView>
    </Grid>
</Window>

這裡我們將一個GridView物件賦值給ListView的View屬性,而在這個GridView物件中,將兩列分別綁定了ID和Name,而DataTable的DefaultView就是一個GridView物件,通過下面的程式碼進行繫結:
this.listBox1.ItemsSource = dt.DefaultView;

執行效果如下:

二、DataTable物件賦值給DataGrid的DataContext。

XAML檔案程式碼如下:
<Window x:Class="_6_18.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <DataGrid Height="147" HorizontalAlignment="Left" Margin="12,12,0,0" Name="datagrid" VerticalAlignment="Top" Width="479" 
                 ItemsSource="{Binding}">
        </DataGrid>
    </Grid>
</Window>



後臺通過如下語句進行賦值:

this. datagrid.DataContext = dt;


值得注意的是:
1、這種繫結方式無需再為Datgrid定義列,它會以DataTable的列自動生成列。
2、ItemsSource="{Binding}",這一句必不可少,這一句會告訴編譯器DataGrid的ItemsSource採用繫結的方式,執行時Binding會自動獲取DefaultView作為自己的Source來使用,缺少後將會繫結不成功,資料不能正常顯示。其實也就相當於:
this. datagrid.ItemsSource = dt. DefaultView;