none
DataGrid und Combobox RRS feed

  • Frage

  • Hallo zusammen,

    ich habe eine Collection von <TimeEntry>

    diese enthalten Referenzen (GUID) auf Projecte und Mitarbeiter.

    In meinem ViewModel lade ich die TimeEntries, die Mitarbeiter und die Projecte in drei verschiedene Collections.

    Mein DataGrid bindet auf die TimeEntries, und enthält ComboBoxen (DataGridTemplateColumn mit Templates)

     

     

     

     für Projecte und Mitarbeiter. Jetzt wird aber erstmal nur die Referenz auf die entsprechenden Lookup's angezeigt:

    Ich google mir schon den Wolf aber bekomme folgende Punkte nich hin

    a) Anzeige der realen Werte aus den Lookup's (Projecte u Mitarbeiter)

    b) setzten der ComboBoxen auf die entsprechenden Werte aus der SelectedRow(DataGrid)

     

    ich hoffe es kann mir jemand helfen.

    Danke

    Peter

     

    Dienstag, 11. Januar 2011 14:23

Antworten

  • Gegeben ist im ViewModel View1 für das Grid mit FK als Fremdbezug und View2 mit ID und Langbezeichnung für die Nachschlagtabelle. Dann kann der XAML so aussehen:
     
    ... DataContext = ="{Binding Source={StaticResource vm}}"
     
      <DataGrid Grid.Row="1" ItemsSource="{Binding View1}" AutoGenerateColumns="False">
        <DataGrid.Columns>
          <DataGridComboBoxColumn Header="Lager"
                                  DisplayMemberPath="Langbezeichnung"
                                  ItemsSource="{Binding Source={StaticResource vm}, Path=View2}"
                                  SelectedValueBinding="{Binding FK}" SelectedValuePath="ID"
                                  />
    ...
          <DataGridTextColumn Header="Bemerkung" MinWidth="100" Binding="{Binding Bemerkung}"/>
        </DataGrid.Columns>
      </DataGrid>
    </Grid>
     
     
    --
    Viele Grüße
    Peter
    Dienstag, 11. Januar 2011 16:08

Alle Antworten

  • Ich würde für die Projekte und Mitarbeiter weitere ViewModels implementieren, die du am Anfang mit den "Anzeigedaten" lädst. Die bindest du dann an die ComobBoxen. Danach würde ich für TimeEntry auch ein ViewModel erstellen, die die Eigenschaften SelectedMitarbeiter und SelectedProjekt vom o.g. Typ des ViewModels enthalten.
    Dann bindest du das DataGrid an die Auflistung der TimeEntryViewModel Ob.Collection.

    Hier mal ein kurzes Pseudo-Beispiel:

    //ViewModel für die View
    public class AllEntriesViewModel
    {
        public ObservableCollection<TimeEntryViewModel> Entries...
        public ObservableCollection<ProjectViewModel> AllProjects...
        public ObservableCollection<PersonalViewModel> AllPersonal...

        public TimeEntryViewModel SelectedEntry...
    }

    //ViewModel für Personal
    public class PersonalViewModel
    {
        public Guid Id...
        public string Name...
    }

    //ViewModel für Projekt
    public class ProjectViewModel
    {
        public Guid Id...
        public string Name...
    }

    //ViewModel für TimeEntry
    public class TimeEntryViewModel
    {
        public TimeEntryViewModel(TimeEntry item)
        ...
        public PersonalViewModel SelectedPersonal...
        public ProjektViewModel SelectedProjekt...
    }

    Dienstag, 11. Januar 2011 14:58
    Beantworter
  • Grüß Dich

    und zuerstmal ein gutes neues Jahr.

    So wie Du in dem Beispiel beschrieben habe ich das schon gemacht.

    Mir geht es nur um das DataBinding alsre für die Combo's und die SelectedRow im grid.

    Peter

    Dienstag, 11. Januar 2011 15:44
  • Danke, das wünsch ich Dir auch.

    Hier das Binding im DataGrid:

    ...
                                           ItemsSource="{Binding Path=Entries, Mode=TwoWay}"
                                           RowHeaderWidth="25"
                                           SelectedItem="{Binding Path=SelectedEntry, Mode=TwoWay}"

    Und hier das Binding in einer ComboBox:

                    <DataGridComboBoxColumn Header="Projekte"
                                                        DisplayMemberPath="Name"
                                                        SelectedValueBinding="{Binding Path=SelectedProject, Mode=TwoWay}"
                                                        Width="*">

                        <DataGridComboBoxColumn.ElementStyle>
                            <Style TargetType="ComboBox">
                                <Setter Property="ItemsSource" Value="{Binding Path=DataContext.AllProjects, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}"/>
                            </Style>
                        </DataGridComboBoxColumn.ElementStyle>

                    </DataGridComboBoxColumn>

    Dienstag, 11. Januar 2011 16:02
    Beantworter
  • Gegeben ist im ViewModel View1 für das Grid mit FK als Fremdbezug und View2 mit ID und Langbezeichnung für die Nachschlagtabelle. Dann kann der XAML so aussehen:
     
    ... DataContext = ="{Binding Source={StaticResource vm}}"
     
      <DataGrid Grid.Row="1" ItemsSource="{Binding View1}" AutoGenerateColumns="False">
        <DataGrid.Columns>
          <DataGridComboBoxColumn Header="Lager"
                                  DisplayMemberPath="Langbezeichnung"
                                  ItemsSource="{Binding Source={StaticResource vm}, Path=View2}"
                                  SelectedValueBinding="{Binding FK}" SelectedValuePath="ID"
                                  />
    ...
          <DataGridTextColumn Header="Bemerkung" MinWidth="100" Binding="{Binding Bemerkung}"/>
        </DataGrid.Columns>
      </DataGrid>
    </Grid>
     
     
    --
    Viele Grüße
    Peter
    Dienstag, 11. Januar 2011 16:08
  • Hallo zusammen,

    den Typ von ClassMP2002 konnte ich nicht umsetzten. Warscheinlich bin ich zu doof dafür......

    Nach einigem probieren aber den von Peter Fleischer.

    Das mit den Resourcen finde ich eh eine tolle Sache, ich glaube die werde ich jetzt öfters verwenden.

    Nun habe ich alles so (hoffentlich) wie ich es möchte.

     

    Danke Euch beiden

    Peter

     

    Mittwoch, 12. Januar 2011 16:48