Announcement

Collapse
No announcement yet.

wpf Datagrid - SelectedItems

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • wpf Datagrid - SelectedItems

    Hallo,

    stehe irgendwie am Schlauch heute und benötige Eure Hilfe. Ich habe ein Datagrid:

    <DataGrid x:Name="Mitarbeiter_GRD" AutoGenerateColumns="False" ItemsSource="{Binding Path=.}" SelectionChanged="Mitarbeiter_GRD_SelectionChanged " SelectionMode="Single">
    <DataGrid.Columns>
    <DataGridTemplateColumn Header="Image" Width="219" IsReadOnly="True">
    <DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
    <Label Content="{Binding erpname}" x:Name="id_lbl" />
    </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn
    </DataGrid.Columns>
    </DataGrid>

    Das Problem ist, wie kann ich auf die das Label id_lbl bei SelectionChange zugreifen?

    Vielen Dank
    lg
    ww

  • #2
    Geht das nicht irgendwie schick über MVVM und DataBinding?

    Comment


    • #3
      Servus,

      ich mache das im Grunde zum ersten Mal, daher bitte verzeih, wenn ich jetzt blöd nachfrage, aber wie genau schaut das aus?

      vielen dank
      lg
      ww

      Comment


      • #4
        Hm naja... MVVM (Model-View-ViewModel) ist eigentlich das Pattern auf dem WPF und Silverlight aufbauen. Im Grunde sieht das so aus:

        [highlight=c#]
        // Hier hast Du Entities aus Deiner Businesslogik
        // Diese Klassen haben also eigentlich nichts mit der Oberfläche zu tun, ausser dass sie angezeigt werden
        public class Model
        {
        // Spalte stellt natürlich irgendwelche Werte dar
        public String Spalte1 { get; set; }
        public String Spalte2 { get; set; }
        }

        public class ViewModel
        {
        public IList<Model> AnzuzeigendeModelle { get; set; } // wenn die Property nur lesend ist kannst Du auch IEnumerable verwenden
        public Model AusgewähltesModel { get; set; }

        public ViewModel()
        {
        // hier würden die Modelle befüllt werden
        // z.B. per Datenbank abfrage
        // könnte auch in der Property oder per Knopfdruck und einem Command gemacht werden
        AnzuzeigendeModelle = new List<Model>();
        }
        }
        [/highlight]

        Das ganze kann man dann per WPF Databinding direkt an die UI binden. Dann ist Dein UI komplett frei von jeglicher Logik. Im Databinding kenne ich mich leider aber auch nicht sonderlich gut aus.

        Tutorials gibs hier:
        http://msdn.microsoft.com/de-de/magazine/dd419663.aspx
        http://www.codeproject.com/Articles/...Start-Tutorial

        Und natürlich noch viele weitere auf google

        Comment


        • #5
          Servus,

          einmal danke für die Infos, werde mich morgen einmal damit befassen. Evtl, ist das schon das Richtige. Mich wunrdert, dass es nicht viel einfacher geht.

          Vielen Dank
          lg
          ww

          Comment


          • #6
            Dieses SelectionChanged verweist auf eine entsprechend anzulegende Funktion im CodeBehind. Wie man das mit DataBinding ins ViewModel bekommt, hab ich auch noch nicht rausgefunden.



            Vom CodeBehind aus kannst Du auf alles zugreifen, was in ViewModel public ist:

            Code:
             MyViewModel vm
             {
                        get
                        {
                            return this.DataContext as MyViewModel;
                        }
             }
            
             private void Grid_SelChange(object sender, SelectionChangedEventArgs e)
             {
                        if (e.AddedItems.Count == 0) return;
                        vm.MachIrgendetwas();
             }

            Eleganter geht es aber, wenn Du nicht SelectionChanged nimmst, sondern SelectedItem auf eine Property im ViewModel bindest.
            Günther

            Comment


            • #7
              soweit so gut...

              Hi,

              so vielen Dank für die Tips, ich bin einen Schritt weiter, aber ich stehe irgendwie mit dem Zeug auf Kriegsfuss.

              Ich binde nun meine Klasse an mein DataGrid, funktioniert prima. Nun möchte ich aber bei SelectionChange Werte aus der Zeile lesen. Ok Ich finde viele Beispiele im www, aber die helfen mir noch nicht wirlich.

              Code:
               DataGrid dataGrid = sender as DataGrid;
                          string strEID = Passowerter_GRD.SelectedCells[0].Item.ToString();
              
                          if (e.AddedItems != null && e.AddedItems.Count > 0)
                          {
                              // find row for the first selected item
                              DataGridRow row = (DataGridRow)dataGrid.ItemContainerGenerator.ContainerFromItem(e.AddedItems[0]);
                              if (row != null)
                              {                           
                                  DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(row);                    
                                  // find grid cell object for the cell with index 1
                                  DataGridCell cell = presenter.ItemContainerGenerator.ContainerFromIndex(1) as DataGridCell;
                                  if (cell != null)
                                  {
                                      cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(1);         
                                  }
                              }
                          }
              SO nun habe ich die Zelle, aber wie greife ich hier auf den Inhalt zu? Bzw. gibt es eine leichtere Möglichkeit auf die Werte der einzelnen Spalten zuzugreifen?

              Vielen Dank
              lg
              ww

              Comment


              • #8
                Schau doch mal hier:

                http://www.codeproject.com/Articles/...e-WPF-DataGrid

                Die binden das selectedItem auch an eine Property des ViewModels

                Comment


                • #9
                  In Deinem Quelltext ganz ganz oben hast Du bei dem DataGrid ItemsSource="{Binding Path=.}" geschrieben. Was der Punkt bewirkt, ist mir nicht ganz klar. Da sollte eine Property vom Typ List<MyModel> angegeben sein, die im ViewModel existiert. Dann solltest Du im ViewModel eine Property vom Typ MyModel haben - nennen wir sie SelItem - die an SelectedItem gebunden wird.



                  Das ist viel eleganter als mit SelectionChanged zu arbeiten. Ich selbst hatte das auch zuerst anders gemacht…


                  In der Set Methode von SelItem kannst Du dann Deiner Property erpname einen neuen Wert zuweisen oder dort einfach nur ein PropertyChanged(„erpname“) einfügen, wenn erpname seinen Wert selbstständig aus SelItem ableiten kann.
                  Günther

                  Comment


                  • #10
                    Hi,

                    sorry mein Quelltext ist seit gestern modifiziert. Ich bin leider total unerfahren was das Databind angeht, da ich eigentlich nur design mache. Daher muss ich weiter dumm fragen.

                    Mein ItemSource sieht jetzt so aus:
                    ItemsSource="{Binding Passwoerter}"

                    Dazu binde ich noch eine Property erpid an SelectedItem:
                    SelectedItem="{Binding PWid}"

                    wenn ich nun eine Zeile markiere und dann einen Button clicke, wie greife ich dann auf die erpid der selektierten Zeile zu?


                    Vielen Dank
                    lg
                    ww

                    Comment


                    • #11
                      Wenn Deine Liste Passwoerter heisst, warum nennst Du dann das SelectedItem nicht einfach Passwort?

                      Dazu binde ich noch eine Property erpid an SelectedItem:
                      SelectedItem="{Binding PWid}"
                      erpid, PWid? Ich verstehe nur Bahnhof.

                      Was für ein Listentyp ist Passwoerter? Was ist Bahnhof für ein Datentyp?




                      Mit ist in 2010 auch immer wieder gesagt worden, ich soll mir die verlinkten Beispiele anschauen...
                      Günther

                      Comment


                      • #12
                        Das hier finde ich auch wirklich gut...

                        http://www.codeproject.com/Articles/...e-WPF-DataGrid

                        Comment


                        • #13
                          Hi,

                          sorry ich habe mich da ein wenig vertran. Mittlerweile habe ich das Problem lösen können.
                          Es ist zwar nicht die sauberste Lösung, aber ich binde nun ein Textfeld außerhalb
                          des Grids an das gerade Selektierte Item im DataGrid, dieses kann ich dann jederzeit abprüfen.

                          Vielen Dank
                          lg
                          Ww

                          Comment


                          • #14
                            Und warum funktioniert die saubere Lösung aus meinem Tutorial nicht? oO

                            Comment


                            • #15
                              Servus,

                              tut sie doch *g*. Danke für Eure Hilfe, der Einstieg wäre geschafft. Eine ich hoffe letzte Frage habe ich noch.

                              Ich zwei DataGrids auf einer Seite. Links quasi eine Auswahl an Datensätzen und rechts soll zum jeweiligen Datensatz eine Detailansicht erscheinen. Ich vermute das geht total simpel oder?

                              Habe nur keinen wirklichen Plan, wie das gehen soll.

                              Danke
                              lg
                              ww

                              Comment

                              Working...
                              X