Laden...

ListBox binding mehrer ItemSources

Erstellt von GtwDev vor einem Jahr Letzter Beitrag vor einem Jahr 462 Views
G
GtwDev Themenstarter:in
1 Beiträge seit 2022
vor einem Jahr
ListBox binding mehrer ItemSources

Hallo zusammen,

ich habe eine ListBox in der ich per ItemSource alle "Bereiche" anzeigen lassen.
Das funktioniert auch problemlos.

Die ListBoxItems haben alle eine Checkbox.
Jetzt soll bei Klick auf einen Eintrag in einem DataGrid nicht nur die, in der
Datenbank hinterlegten Einträge angezeigt werden, sondern alle "Bereiche"
und alle hinterlegten als "checked".

Steh da irgendwie auf dem schlauch. Hoffe Ihr könnt mir weiterhelfen.

Meine ListBox


<ListBox Name="LbBereich" VerticalAlignment="Stretch" Height="248"
                                     ItemsSource="{Binding Source={StaticResource eaViewSource}}">  <!-- Hier ALLE AREAS laden -->
                                <ListBox.ItemTemplate>
                                    <DataTemplate>
                                        <Border>
                                            <StackPanel Orientation="Horizontal">
                                                <CheckBox Margin="2" VerticalAlignment="Center" Checked="CheckBox_UnChecked" Unchecked="CheckBox_UnChecked"
                                                          Tag="{Binding AreaId}"
                                                          IsChecked="{Binding IsSelected}"/> <!-- NUR die beim Employee hinterlegten einträge als checked -->
                                                <TextBlock Margin="2" FontSize="14"  Text="{Binding DescLong}"/>
                                            </StackPanel>
                                        </Border>
                                    </DataTemplate>
                                </ListBox.ItemTemplate>
                            </ListBox>

Resources


<CollectionViewSource x:Key="employeeViewSource"/>
        <CollectionViewSource x:Key="employeeAreaViewSource" 
                              Source="{Binding EmployeeAreas, Source={StaticResource employeeViewSource}}"/>
        <CollectionViewSource x:Key="employeeHolidayViewSource" 
                              Source="{Binding EmployeeHolidays, Source={StaticResource employeeViewSource}}"/>

        <CollectionViewSource x:Key="areaViewSource" />
        <CollectionViewSource x:Key="eaViewSource"
                              Source="{Binding EmployeeAreas, Source={StaticResource areaViewSource}}"/>

Models


public class Employee
    {
        [Key]
        public int EmployeeId { get; set; }
        public string Firstname { get; set; }
        public string Lastname { get; set; }
        public string FullVN { get; set; }
        public string FullNV { get; set; }
        public int HolidayR { get; set; }
        public int HolidayA { get; set; }
        public int HolidayG { get; set; }

        public virtual ICollection<EmployeeArea> EmployeeAreas { get; private set; } = new ObservableCollection<EmployeeArea>();
        public virtual ICollection<EmployeeHoliday> EmployeeHolidays { get; private set; } = new ObservableCollection<EmployeeHoliday>();
        public virtual ICollection<EmployeeDay> EmployeeDays { get; private set; } = new ObservableCollection<EmployeeDay>();
    }

public class EmployeeArea
    {
        [Key]
        public int EmployeeAreaId { get; set; }
        //public string DescShort { get; set; }
        //public string DescLong { get; set; }
        public bool IsSelected { get; set; }
        public bool MainArea { get; set; }
        //public int AreaId { get; set; }
        //public virtual Area Area { get; set; }
        public int EmployeeId { get; set; }
        public virtual Employee Employee { get; set; }
        //public virtual ICollection<Area> Areas { get; private set; } = new ObservableCollection<Area>();
        public int AreaId { get; set; }
        public virtual Area Area { get; set; }
    }

public class Area
    {
        [Key]
        public int AreaId { get; set; }
        public string DescShort { get; set; }
        public string DescLong { get; set; }
        public virtual EmployeeArea EmployeeArea { get; set; }
    }

Hoffe es ist verständlich und alles an Infos dabei.

Vielen Dank

16.806 Beiträge seit 2008
vor einem Jahr

Du solltest Deine Datenbank-Schicht unabhängig von Deiner UI umsetzen.
Siehe [Artikel] Drei-Schichten-Architektur
Datenbank-Modelle haben in der UI nichts zu suchen.

In der Umsetzung kann ein UI Modell (bei Dir ein ViewModel, da WPF) einem Datenbank-Modell entsprechen, muss aber nicht.
In der Realität ist das sehr selten der Fall. Hier sieht es auch so aus, dass Du keinerlei Normalisierung in Deinen DB Modellen umgesetzt hast, sondern eher die UI Anzeige versuchst in die DB zu pressen.
Mapping Modelle haben oft auch das Suffix "Association".

Das UI Modell (aka ViewModel) sollte so aussehen, wie die View das braucht.
Dann kannst Du auch Deine Anforderung hier leicht(er) umsetzen.
[Artikel] MVVM und DataBinding

PS: auch für die Bindung ist eine ObservableCollection in der Eigenschaft notwendig. ICollection ist für die DB, nicht für WPF.