在運行時,我想動態地在WPF ListView中構建網格列(或其他顯示佈局)。我不知道列表的數量和名稱。在運行時動態創建WPF ItemTemplate
我希望能夠做到:
MyListView.ItemSource = MyDataset;
MyListView.CreateColumns();
在運行時,我想動態地在WPF ListView中構建網格列(或其他顯示佈局)。我不知道列表的數量和名稱。在運行時動態創建WPF ItemTemplate
我希望能夠做到:
MyListView.ItemSource = MyDataset;
MyListView.CreateColumns();
我想嘗試以下方法:
A)你需要有列表框中顯示網格視圖 - 我相信這一點,你已經
乙完成的)定義樣式GridViewColumnHeader:
<Style TargetType="{x:Type GridViewColumnHeader}" x:Key="gridViewColumnStyle">
<EventSetter Event="Click" Handler="OnHeaderClicked"/>
<EventSetter Event="Loaded" Handler="OnHeaderLoaded"/>
</Style>
在我的情況下,我有一大堆其他屬性設置,但在基本情況下 - 你需要Loaded事件。點擊 - 如果您想添加排序和篩選功能,這很有用。
C)在您的列表視圖代碼,綁定模板與你的GridView:
public MyListView()
{
InitializeComponent();
GridView gridViewHeader = this.listView.View as GridView;
System.Diagnostics.Debug.Assert(gridViewHeader != null, "Expected ListView.View should be GridView");
if (null != gridViewHeader)
{
gridViewHeader.ColumnHeaderContainerStyle = (Style)this.FindResource("gridViewColumnStyle");
}
}
d),那麼在你OnHeaderLoaded處理,你可以基於列的數據設置合適的模板
void OnHeaderLoaded(object sender, RoutedEventArgs e)
{
GridViewColumnHeader header = (GridViewColumnHeader)sender;
GridViewColumn column = header.Column;
//在這裏選擇並應用您的數據模板。
e.Handled = true;
}
E)我想你還需要獲得ItemsSource依賴屬性的所有權,並處理它的更改事件。
ListView.ItemsSourceProperty.AddOwner(typeof(MyListView), new PropertyMetadata(OnItemsSourceChanged));
static void OnItemsSourceChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
MyListView view = (MyListView)sender;
//do reflection to get column names and types
//and for each column, add it to your grid view:
GridViewColumn column = new GridViewColumn();
//set column properties here...
view.Columns.Add(column);
}
的GridViewColumn類本身沒有太多的屬性,所以你可能要在那裏添加一些信息使用附加的屬性 - 即像唯一列標籤 - 標題很可能將用於本地化,你不會在這一個接力。
一般而言,這種方法即使相當複雜,也可以讓您輕鬆擴展列表視圖功能。
有一個DataTemplateselector選擇一個預定義的模板(相同的DataType)並將選擇器應用於ListView。您可以擁有具有不同列的多個DataTemplates。
您可以使用DataTemplateSelector返回您在代碼中動態創建的DataTemplate。然而,這比使用XAML中預定義的一個有點繁瑣和複雜,但它仍然是可能的。 看一看這個例子:http://dedjo.blogspot.com/2007/03/creating-datatemplates-from-code.html
您可以使用附加屬性動態添加列到ListView。看看CodeProject這篇文章,它解釋了......
從MSDN:
MyListBox.ItemsSource = view;
ListView myListView = new ListView();
GridView myGridView = new GridView();
myGridView.AllowsColumnReorder = true;
myGridView.ColumnHeaderToolTip = "Employee Information";
GridViewColumn gvc1 = new GridViewColumn();
gvc1.DisplayMemberBinding = new Binding("FirstName");
gvc1.Header = "FirstName";
gvc1.Width = 100;
myGridView.Columns.Add(gvc1);
GridViewColumn gvc2 = new GridViewColumn();
gvc2.DisplayMemberBinding = new Binding("LastName");
gvc2.Header = "Last Name";
gvc2.Width = 100;
myGridView.Columns.Add(gvc2);
GridViewColumn gvc3 = new GridViewColumn();
gvc3.DisplayMemberBinding = new Binding("EmployeeNumber");
gvc3.Header = "Employee No.";
gvc3.Width = 100;
myGridView.Columns.Add(gvc3);
//ItemsSource is ObservableCollection of EmployeeInfo objects
myListView.ItemsSource = new myEmployees();
myListView.View = myGridView;
myStackPanel.Children.Add(myListView);
從以往的經驗,我可以推薦轉向清晰的動態數據模板,如果你能幫助它... ...而使用這裏給出的建議來顯式創建的ListView列而不是試圖動態地創建一個DataTemplate。
原因是FrameworkElementFactory(或者在運行時用於生成DataTemplates的任何類名)在使用(並且不贊成使用XAML用於動態模板)方面有點粗糙 - 無論哪種方式,都會使性能受到影響。
我不知道以前的列數或名稱 - 這將如何幫助? – Peter 2008-09-24 07:38:10