2009/12/31

WPF ListView + GridView Items.Add

我們的程式用到了 ListView,而且又用了 GridView 分欄,讓清單看起來比較美觀,結果就像是Windows檔案總管的詳細資料那樣。


<ListView x:Name="listView1" Margin="178,29,35,51" SelectionMode="Single">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="FileName" Width="230" DisplayMemberBinding="{Binding Path=FileName}" />
            <GridViewColumn Header="Date" Width="140" DisplayMemberBinding="{Binding Path=Date}" />
        </GridView>
    </ListView.View>
</ListView>

但是加上了GridView的ListView,不再可以容易的以 物件名.Items.Add("String") 直接新增一條資料,這樣許多欄位的資料都會一樣。網路上的做法是使用資料繫結的方式,維護一個物件然後 Bind 上去即可,但是我還是習慣以程式動態新增,可不可以達成呢?當然可以。

因為是 WPF,所以沒有 Windows Form 的 ListViewItem 物件和物件名.SubItem 等屬性可以用。查了一下網路說明,需要建立一個物件而不是文字傳入 Items.Add()。

因為我是多欄,所以物件也要有多個屬性值,我建立一個結構來儲存:
private struct FileStructure{
    public string FileName { get; set; }
    public String Date { get; set; }
}
值得一提的是 { get; set; } 要加上,如果沒有加上這個繫結將會失敗。

然後在 WPF 的 GridView 的 DisplayMemberBinding 屬性設定 Binding,讓程式知道物件的哪個值對應到哪個欄位。請參考一開始的 WPF 原始碼。雖然我的方法還是有用到 Bind,但那是告訴 ListView 我的東西要怎樣呈現。

最後,以程式新增:

listView1.Items.Add(new FileStructure{ FileName = "test.zip", Date = "2009/12/21" });
listView1.Items.Add(new FileStructure{ FileName = "test.rar", Date = "2009/12/22" });
...

這樣就可以動態新增ListView的資料,而且每一欄的資料都正確的填進去了。
---
參考文獻:
http://stackoverflow.com/questions/1305406/wpf-listview-how-to-bind-single-items

沒有留言:

張貼留言