4 Stimmen

WPF ItemTemplate DYNAMICALLY zur Laufzeit erstellen

Zur Laufzeit möchte ich dynamisch Grid-Spalten (oder ein anderes Display-Layout) in einem WPF ListView erstellen. Ich weiß nicht, die Anzahl und Namen der Spalten vor der Hand.

Ich möchte in der Lage sein, das zu tun:
MyListView.ItemSource = MyDataset;
MyListView.CreateColumns();

3voto

Tawani Punkte 10880

Sie können Spalten dynamisch zu einer ListView hinzufügen, indem Sie Attached Properties verwenden. Sehen Sie sich diesen Artikel über die CodeProjekt erklärt sie genau das...

WPF DynamicListView - Bindung an eine DataMatrix

2voto

treehouse Punkte 2495

Von 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);

1voto

Greg Punkte 555

Ich würde folgenden Ansatz versuchen:

A) Sie müssen das Listenfeld in der Gitteransicht anzeigen lassen - ich glaube, das haben Sie bereits getan
B) einen Stil für GridViewColumnHeader definieren:

        <Style TargetType="{x:Type GridViewColumnHeader}" x:Key="gridViewColumnStyle">
            <EventSetter Event="Click" Handler="OnHeaderClicked"/>
            <EventSetter Event="Loaded" Handler="OnHeaderLoaded"/>
        </Style>

In meinem Fall hatte ich eine ganze Reihe von anderen Eigenschaften eingestellt, aber im Basisszenario - Sie würden Loaded Ereignis benötigen. Geklickt - dies ist nützlich, wenn Sie Sortier- und Filterfunktionen hinzufügen möchten.

C) Binden Sie in Ihrem Listview-Code die Vorlage mit Ihrem 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) dann in Ihrem OnHeaderLoaded-Handler, können Sie eine geeignete Vorlage auf der Grundlage der Daten der Spalte festlegen

    void OnHeaderLoaded(object sender, RoutedEventArgs e)
    {
        GridViewColumnHeader header = (GridViewColumnHeader)sender;
        GridViewColumn column = header.Column;

//Wählen Sie hier Ihre Datenvorlage aus und wenden Sie sie an.

        e.Handled = true;
    }

E) Ich schätze, Sie müssten auch das Eigentum an der ItemsSource-Abhängigkeitseigenschaft erwerben und ihr Änderungsereignis behandeln.

            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);
        }

die GridViewColumn-Klasse selbst hat nicht viele Eigenschaften, so dass Sie vielleicht einige Informationen dort mit angehängten Eigenschaften hinzufügen möchten - d.h. wie eindeutige Spalte Tag - Kopfzeile höchstwahrscheinlich für die Lokalisierung verwendet werden, und Sie werden nicht auf diese weitergeben.

Im Allgemeinen können Sie mit diesem Ansatz, auch wenn er recht kompliziert ist, die Funktionalität Ihrer Listenansicht leicht erweitern.

0voto

Jobi Joy Punkte 47482

Haben Sie eine DataTemplateselector um eine der vordefinierten Vorlagen (vom gleichen Datentyp) auszuwählen und den Selektor auf die ListView anzuwenden. Sie können so viele DataTemplates mit verschiedenen Spalten haben.

0 Stimmen

Ich kenne weder die Nummer noch den Namen der Spalten - wie soll das helfen?

0voto

EFrank Punkte 1820

Sie können eine DataTemplateSelector um ein DataTemplate zurückzugeben, das Sie dynamisch im Code erstellt haben. Dies ist zwar etwas mühsam und komplizierter als die Verwendung eines vordefinierten DataTemplates aus XAML, aber es ist dennoch möglich. Werfen Sie einen Blick auf dieses Beispiel: http://dedjo.blogspot.com/2007/03/creating-datatemplates-from-code.html

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X