Frage

Zur Laufzeit möchte ich dynamisch Rasterspalten bauen (oder einen anderen Anzeigelayout) in einer WPF-Listview. Ich weiß nicht, die Anzahl und Namen der Spalten vor der Hand.

Ich will tun können:
  MyListView.ItemSource = MyDataSet;
  MyListView.CreateColumns ();

War es hilfreich?

Lösung

ich würde versuchen, folgenden Ansatz:

A) benötigen Sie das Listenfeld Anzeigerasteransicht haben - ich glaube, das Sie bereits
getan hast B) definieren einen Stil für Gridviewcolumnheader:

        <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 festgelegt, aber im Basisszenario - Sie Loaded-Ereignis benötigen würden. Klickte -. Dies ist nützlich, wenn Sie das Sortieren und Filtern Funktionalität hinzufügen möchten

C) in der Listview-Code, bindet 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 Ihnen OnHeaderLoaded Handler können Sie eine richtige Vorlage auf die Daten der Spalte basiert gesetzt

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

// auswählen und anwenden, um Ihre Datenvorlage hier.

        e.Handled = true;
    }

E) Ich denke, Sie auch das Eigentum an Itemssource-Abhängigkeitseigenschaft erwerben müssen und damit umgehen geänderte Ereignis ist.

            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 einige Informationen hinzufügen möchten vielleicht dort angefügten Eigenschaften mit - also wie eindeutigem Spalte tag - Header höchstwahrscheinlich für die Lokalisierung verwendet werden, und Sie werden nicht auf diesem einen Relais .

In der Regel ist dieser Ansatz, obwohl ziemlich kompliziert, können Sie einfach Ihre Listenansicht Funktionalität erweitern.

Andere Tipps

Sie können mit festen Händen Eigenschaften Spalten dynamisch zu einem Listview hinzuzufügen. Schauen Sie sich diesen Artikel auf der Seite Codeproject es wird genau erklärt, dass ...

WPF DynamicListView - Bindung an eine Data-Matrix

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

Haben Sie einen Datatemplateselector eine der vordefinierten Vorlagen wählen (Von denselben Datentyp) und den Wähler gelten auf das Listview. Sie können beliebig viele Datatemplates mit verschiedenen Spalten haben.

Sie können eine Datatemplateselector verwenden, um ein Datatemplate zurückkehren, die Sie dynamisch in Code erstellt haben. Dies ist jedoch ein bisschen langweilig und komplizierter als eine vordefinierte eines von XAML, aber es ist immer noch möglich. Werfen Sie einen Blick auf dieses Beispiel: http: //dedjo.blogspot .com / 2007/03 / Erstellen-Datatemplates-from-code.html

Aus Erfahrung kann ich Lenkung frei von dynamischen Datenvorlagen empfehlen, wenn Sie es vermeiden können ... eher den Rat hier gegeben verwenden, um explictly die Listview-Spalten zu erstellen, anstatt zu versuchen, ein Datatemplate dynamisch zu erstellen.

Der Grund hierfür ist, dass die Framework (oder was auch immer der Klassenname für die Herstellung von Datatemplates zur Laufzeit ist) etwas cludgey zu bedienen (und ist für den Einsatz von XAML für dynamische Vorlagen veraltet.) - Wie auch immer Sie eine Performance Hit nehmen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top