Gruppierte Collection in DataTemplate anzeigen

  • WPF

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von MichaHo.

    Gruppierte Collection in DataTemplate anzeigen

    Hi,
    ich hab da ein Problemchen an dem ich nicht recht weiter komme (Knoten im Hirn)
    Ich hab eine kleine Anwendung zur Zeiterfassung.
    Nun möchte ich in einer Liste alle Zeiteinträge anzeigen, diese aber gruppiert nach dem jeweiligen Datum und dann in einem Expander die Einträge des Tages (Kommen, Pause, Gehen).
    Wie ich die Daten im Expander anzeige habe ich schon raus gefunden, das sieht auch soweit super aus.
    Nun habe ich im ViewModel quasi meine Observable Collection einfach per GroupBy auf das Datum Gruppiert und nahm an, das wenn ich diese Collection dann an das Items Control binde, ich eine Gruppierte Ansicht bekomme... naja, bekomm ich nicht....

    Hier hab ich mal die entsprechenden XAML und ViewModel.

    Das UserControl für die Liste:
    Spoiler anzeigen

    XML-Quellcode

    1. <UserControl x:Class="TimeTracker.App.TimeTrackingListControl"
    2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    4. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    5. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    6. xmlns:local="clr-namespace:TimeTracker.App"
    7. xmlns:vm="clr-namespace:TimeTracker.ViewModel;assembly=TimeTracker.ViewModel"
    8. mc:Ignorable="d" d:DataContext="{d:DesignInstance IsDesignTimeCreatable=True,Type={x:Type vm:TimeTrackingListViewModel}}"
    9. d:DesignHeight="450" d:DesignWidth="800">
    10. <Grid>
    11. <Grid.RowDefinitions>
    12. <RowDefinition Height="Auto"/>
    13. <RowDefinition Height="*"/>
    14. </Grid.RowDefinitions>
    15. <Border Grid.Row="0" BorderBrush="{DynamicResource OrangeBrush}" BorderThickness="0,0,0,0.5">
    16. </Border>
    17. <Border Grid.Row="1">
    18. <ScrollViewer VerticalScrollBarVisibility="Auto">
    19. <ItemsControl ItemsSource="{Binding TimeEntries}">
    20. <ItemsControl.ItemTemplate>
    21. <DataTemplate >
    22. <Border Margin="5" Padding="10" BorderBrush="{DynamicResource OrangeBrush}" BorderThickness="1">
    23. <StackPanel>
    24. <TextBlock FontFamily="{StaticResource DefaultBold}"
    25. FontSize="{StaticResource FontSizeLarge}"
    26. Foreground="{DynamicResource DarkBrush}"
    27. Text="{Binding StampTime, Converter={local:StampTimeToLongDateStringConverter}}"/>
    28. <Expander Header="Tages Einträge" Grid.Row="2" IsExpanded="False">
    29. <Border BorderBrush="{DynamicResource OrangeBrush}" BorderThickness="1" Margin="3" Padding="5">
    30. <StackPanel Orientation="Vertical">
    31. <local:TimeTrackingListItemControl />
    32. </StackPanel>
    33. </Border>
    34. </Expander>
    35. </StackPanel>
    36. </Border>
    37. </DataTemplate>
    38. </ItemsControl.ItemTemplate>
    39. </ItemsControl>
    40. </ScrollViewer>
    41. </Border>
    42. </Grid>
    43. </UserControl>



    das dazugehörige ViewModel

    Spoiler anzeigen

    C#-Quellcode

    1. namespace TimeTracker.ViewModel
    2. {
    3. public class TimeTrackingListViewModel : ViewModelBase
    4. {
    5. private readonly TimeEntry _timeEntryModel;
    6. public ObservableCollection<TimeTrackingListItemViewModel> TimeEntries { get; set; }
    7. private TimeTrackingListItemViewModel _selectedTimeEntry;
    8. public TimeTrackingListItemViewModel SelectedTimeEntry { get => _selectedTimeEntry; set => SetValue(ref _selectedTimeEntry, value); }
    9. public TimeTrackingListViewModel()
    10. {
    11. ReloadData();
    12. InitializeCommands();
    13. }
    14. private void InitializeCommands()
    15. {
    16. }
    17. public TimeTrackingListViewModel(TimeEntry timeEntry)
    18. {
    19. _timeEntryModel = timeEntry;
    20. }
    21. private void ReloadData()
    22. {
    23. var timeEntryList = TimeTrackerLogic.GetPersonTimeEntries(IoC.Application.CurrentPersonId);
    24. TimeEntries = new ObservableCollection<TimeTrackingListItemViewModel>();
    25. timeEntryList.ForEach(t => TimeEntries.Add(new TimeTrackingListItemViewModel(t)));
    26. TimeEntries.GroupBy(t => t.StampTime.Date);
    27. SelectedTimeEntry = TimeEntries.FirstOrDefault();
    28. }
    29. }
    30. }



    anbei noch ein Bildchen, wie es momentan aussieht, wie gesagt, ich hätte gerne pro Tag (also pro Datum) nur 1 Eintrag in der Liste und dann die anderen Einträge des Tage im Expander.

    auch ein kurzer Auszug aus der DB.

    Danke Euch für Eure Tips

    Grüße
    Micha
    Bilder
    • TimeTracker_Liste.png

      29,74 kB, 508×513, 120 mal angesehen
    • TimeEntries_DB.png

      32,03 kB, 1.357×424, 105 mal angesehen
    "Hier könnte Ihre Werbung stehen..."
    Hallo Micha

    MichaHo schrieb:

    Nun habe ich im ViewModel quasi meine Observable Collection einfach per GroupBy auf das Datum Gruppiert und nahm an, das wenn ich diese Collection dann an das Items Control binde, ich eine Gruppierte Ansicht bekomme

    Genau da ist der Knoten im Hirn.
    GroupBy (per Linq) ist nur da um die Daten Gruppiert zu bekommen um dann im Code damit weiter zu arbeiten. Um die View zu Gruppieren ist die CollectionViewSource da. (Siehe mein Tutorial)
    Diese bietet all die funktionalitäten wie Grouping, Filtern, usw. welche auch für die View (GroupTemplate) übernommen wird.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Hi Sascha,
    Jo, danke Dir, da hatte ich wirklich einen Knoten.
    Ähm, du arbeitest da mit einer IcollectionView im Viewmodel, das geht bei meinem .NetCore leider nicht.
    Also hab ich gestern noch bis spät in die Nacht nach einer Lösung geguckt und eine Lösung bei StackOverflow für eine ObservableGroupedCollection gefunden.
    Leuchtet soweit auch ein, allerdings wird in der View zwar gruppiert, aber leider erscheint immer nur ein Eintrag obwohl für jede Gruppe mehrere Einträge vorhanden sind.

    Ich schau mir nachher nochmal dein Tut an, vielleicht übersehe ich etwas.
    "Hier könnte Ihre Werbung stehen..."
    Hallo

    Sorry, du hattest nicht geschrieben das es um .Net Core geht.

    Folgender Beitrag sollte zum Ziel führen: stackoverflow.com/questions/58…ionview-with-net-core-3-0

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Den Artikel hatte ich auch gefunden und noch nicht ganz durchgeblickt.
    Aber, ich hab grad nochmal dein Tut überflogen und im Grunde sieht mein View fast genauso aus, nur hatte ich im Expander im Groupstyle das ItemPresenter vergessen.

    du schreibst dort zwar auch das es ohne die IcollectionView Grütze ist, aber das stört bei mir nicht, da dieses View nur anzeigen soll und zwar gruppiert. Das ändern löschen und hinzufügen passiert dann wieder über DialogBoxen, bzw. Pages. Und danach wird die Collection ja eh upgedatet....

    ich teste das mal und melde mich wieder...

    danke Dir...

    EDIT: @Nofear23m
    Das klappt wirklich, komplett ohne den ganzen GroupedObeservablecollection quatsch....
    ABER... gruppiert wird nun über das xaml, das ist soweit OK.
    NUR meine TimeEntries Collection ist vom Typ TimeTrackingListItemViewModel und dieses ViewModel enthält eben die ganzen Properties.
    Scheinbar habe ich vomn xaml aus aber keinen Zugriff auf diese Properties.
    Das einzige was angezeigt wird, ist ItemsCount und daran kann ich sehen, das er auch richtig gruppiert.

    das Xaml sieht im Moment so aus:

    XML-Quellcode

    1. <UserControl x:Class="TimeTracker.App.TimeTrackingListControl"
    2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    4. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    5. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    6. xmlns:local="clr-namespace:TimeTracker.App"
    7. xmlns:componentModel="clr-namespace:System.ComponentModel;assembly=WindowsBase"
    8. xmlns:vm="clr-namespace:TimeTracker.ViewModel;assembly=TimeTracker.ViewModel"
    9. mc:Ignorable="d" d:DataContext="{d:DesignInstance IsDesignTimeCreatable=True,Type={x:Type vm:TimeTrackingListViewModel}}"
    10. d:DesignHeight="450" d:DesignWidth="800">
    11. <UserControl.Resources>
    12. <CollectionViewSource x:Key="cvs" Source="{Binding TimeEntries}">
    13. <CollectionViewSource.GroupDescriptions>
    14. <PropertyGroupDescription PropertyName="Date"/>
    15. </CollectionViewSource.GroupDescriptions>
    16. <CollectionViewSource.SortDescriptions>
    17. <componentModel:SortDescription PropertyName="StampTime"/>
    18. </CollectionViewSource.SortDescriptions>
    19. </CollectionViewSource>
    20. </UserControl.Resources>
    21. <Grid>
    22. <Grid.RowDefinitions>
    23. <RowDefinition Height="Auto"/>
    24. <RowDefinition Height="*"/>
    25. </Grid.RowDefinitions>
    26. <Border Grid.Row="0" BorderBrush="{DynamicResource OrangeBrush}" BorderThickness="0,0,0,0.5">
    27. </Border>
    28. <Border Grid.Row="1">
    29. <ScrollViewer VerticalScrollBarVisibility="Auto">
    30. <ItemsControl ItemsSource="{Binding Source={StaticResource cvs}}">
    31. <ItemsControl.GroupStyle>
    32. <GroupStyle>
    33. <GroupStyle.ContainerStyle>
    34. <Style TargetType="{x:Type GroupItem}">
    35. <Setter Property="Margin" Value="0,0,0,5"/>
    36. <Setter Property="Template">
    37. <Setter.Value>
    38. <ControlTemplate TargetType="{x:Type GroupItem}">
    39. <Expander IsExpanded="True"
    40. BorderThickness="1,1,1,5">
    41. <Expander.Header>
    42. <DockPanel>
    43. <TextBlock FontWeight="Bold"
    44. Text="{Binding Path=Date, Converter={local:StampTimeToLongDateStringConverter}}"
    45. Margin="5,0,0,0"
    46. Width="100"/>
    47. <TextBlock FontWeight="Bold"
    48. Text="{Binding Path=ItemCount}"/>
    49. </DockPanel>
    50. </Expander.Header>
    51. <Expander.Content>
    52. <local:TimeTrackingListItemControl />
    53. </Expander.Content>
    54. </Expander>
    55. </ControlTemplate>
    56. </Setter.Value>
    57. </Setter>
    58. </Style>
    59. </GroupStyle.ContainerStyle>
    60. </GroupStyle>
    61. </ItemsControl.GroupStyle>
    62. </ItemsControl>
    63. </ScrollViewer>
    64. </Border>
    65. </Grid>
    66. </UserControl>


    die beiden ViewModels:
    TimeTrackingListViewModel:
    Spoiler anzeigen

    C#-Quellcode

    1. using System.Collections.ObjectModel;
    2. using TimeTracker.Data.Logic;
    3. using TimeTracker.Model;
    4. namespace TimeTracker.ViewModel
    5. {
    6. public class TimeTrackingListViewModel : ViewModelBase
    7. {
    8. private readonly TimeEntry _timeEntryModel;
    9. public ObservableCollection<TimeTrackingListItemViewModel> TimeEntries { get; set; }
    10. private TimeTrackingListItemViewModel _selectedTimeEntry;
    11. public TimeTrackingListItemViewModel SelectedTimeEntry { get => _selectedTimeEntry; set => SetValue(ref _selectedTimeEntry, value); }
    12. private ObservableCollection<TimeTrackingListItemViewModel> GetTimeEntries()
    13. {
    14. var timeEntryList = TimeTrackerLogic.GetPersonTimeEntries(IoC.Application.CurrentPersonId);
    15. TimeEntries = new ObservableCollection<TimeTrackingListItemViewModel>();
    16. timeEntryList.ForEach(t => TimeEntries.Add(new TimeTrackingListItemViewModel(t)));
    17. return TimeEntries;
    18. }
    19. public TimeTrackingListViewModel()
    20. {
    21. GetTimeEntries();
    22. InitializeCommands();
    23. }
    24. private void InitializeCommands()
    25. {
    26. }
    27. public TimeTrackingListViewModel(TimeEntry timeEntry)
    28. {
    29. _timeEntryModel = timeEntry;
    30. }
    31. }
    32. }



    das TimeTrackingListItemViewModel:

    Spoiler anzeigen

    C#-Quellcode

    1. using System;
    2. using TimeTracker.Model;
    3. namespace TimeTracker.ViewModel
    4. {
    5. /// <summary>
    6. /// Klasse für einen Zeiteintrag
    7. /// </summary>
    8. public class TimeTrackingListItemViewModel : ViewModelBase
    9. {
    10. private readonly TimeEntry _timeEntryModel;
    11. /// <summary>
    12. /// die eingetragene Stempelzeit
    13. /// </summary>
    14. private DateTime _stampTime;
    15. public DateTime StampTime { get => _stampTime; set => SetValue(ref _stampTime, value); }
    16. /// <summary>
    17. /// das zugehörige Zeitkonto
    18. /// </summary>
    19. private TimeAccountEnum _timeAccount;
    20. public TimeAccountEnum TimeAccount { get => _timeAccount; set => SetValue(ref _timeAccount, value); }
    21. /// <summary>
    22. /// die Dauer des Zeiteintrages
    23. /// </summary>
    24. private TimeSpan _duration;
    25. public TimeSpan Duration { get => _duration; set => SetValue(ref _duration, value); }
    26. /// <summary>
    27. /// die dazugehörige Person
    28. /// </summary>
    29. private Person _person;
    30. public Person Person { get => _person; set => SetValue(ref _person, value); }
    31. /// <summary>
    32. /// zeigt an ob der Zeiteintrag als anwesend markiert ist
    33. /// </summary>
    34. private bool _isPresent;
    35. public bool IsPresent { get => _isPresent; set => SetValue(ref _isPresent, value); }
    36. /// <summary>
    37. /// Kommentar
    38. /// </summary>
    39. private DateTime _date;
    40. public DateTime Date { get => _date; set => SetValue(ref _date, value); }
    41. public TimeTrackingListItemViewModel()
    42. {
    43. _timeEntryModel = new TimeEntry();
    44. }
    45. public TimeTrackingListItemViewModel(TimeEntry timeEntry)
    46. {
    47. _timeEntryModel = timeEntry;
    48. StampTime = _timeEntryModel.StampTime;
    49. TimeAccount = _timeEntryModel.TimeAccount;
    50. Duration = _timeEntryModel.Duration;
    51. Person = _timeEntryModel.Person;
    52. IsPresent = _timeEntryModel.IsPresent;
    53. Date = _timeEntryModel.Date;
    54. }
    55. }
    56. }


    ich häng noch ein Bildchen dran, wie es im Moment aussieht
    "Hier könnte Ihre Werbung stehen..."

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „MichaHo“ ()

    ich bin einen kleinen Schritt weiter:



    Nun werden mir die Einträge zum Gruppierten Datum auch angezeigt...

    ABER eben das Datum im Header nicht...

    XML-Quellcode

    1. <ControlTemplate TargetType="{x:Type GroupItem}">
    2. <Expander IsExpanded="True">
    3. <Expander.Header>
    4. <DockPanel>
    5. <TextBlock FontFamily="{StaticResource DefaultBold}"
    6. FontSize="{StaticResource FontSizeLarge}"
    7. Foreground="{DynamicResource DarkBrush}"
    8. Text="{Binding Date, Converter={local:StampTimeToLongDateStringConverter}}"/>
    9. <TextBlock FontFamily="{StaticResource DefaultBold}"
    10. FontSize="{StaticResource FontSizeLarge}"
    11. Foreground="{DynamicResource DarkBrush}"
    12. Text="{Binding Path=ItemCount}"/>
    13. </DockPanel>
    14. </Expander.Header>
    15. <Expander.Content>
    16. <ItemsPresenter/>
    17. </Expander.Content>
    18. </Expander>
    19. </ControlTemplate>


    wie gesagt, Date ist ein Property im TimeTrackingListItemViewModel welches in TimeEntries drin ist.
    "Hier könnte Ihre Werbung stehen..."
    Ahhh, ich vermute ich weis woran es liegt.
    In deinem Tut setzt Du die GroupDescription Property ja auf das Enum Gender.
    Und im Template für das GroupItem bindest Du auf den Name.
    Also wird daraus Gender.Name und ergibt dann Male oder Female.

    Ich setze ja auf ein DateTime namens Date und binde dann wieder auf Date, das würde Date.Date geben.
    Durch den Converter mach ich daraus aber einen LongDateTimeString.

    Ich Versuch mal was anderes....
    "Hier könnte Ihre Werbung stehen..."
    So, geschafft.

    Meine obige Erklärung ist falsch.
    Das Path=Name bezieht sich auf den PropertyName, der in der Groupdescription angegeben wird.
    Somit wird im Hintergrund aus Path=Name das Property Date aus dem ViewModel und durch den Converter wird es dann zu einem LongDateString Convertriert.

    Sieht jetzt so aus und gefällt mir ganz gut:



    jetzt ändere ich noch die Stempelzeitpunkte im Model, damit ich RealIn und RealOut sehe und eventuell bearbeiten kann....
    Dann noch die Salden und paar Kleinigkeiten... dann sollte es fertig sein...
    "Hier könnte Ihre Werbung stehen..."
    Hallo

    Freut mich das du es geschafft hast. Man sieht, mit ein wenig probieren kommt man früher oder später drauf wie es geht.

    Hast du denn nun die CollectionViewsource auch in das ViewModel bekommen? Das würde mich interessieren da ich mit .Net Core noch kein WPF Projekt gemacht habe.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Hi,
    Danke Dir!
    Nee, das hab ich noch nicht. Mir war erstmal wichtig zu verstehen, wie ich gruppieren kann.
    eigentlich sollte die Übersicht auch statisch sein, also nicht filterbar. Aber mir ist die Nacht eingefallen das es doch sinnvoll ist, einen Filter setzen zu können, denn kein User wühlt sich durch hunderte Einträge um einen bestimmten Stempelzeitpunkt zu ändern.
    meine erste Planung sah vor, die Suche nach einem Zeitpunkt außerhalb der Liste zu machen, aber das ist ja blödsinn.

    Ich hab heute Morgen aber deinen Link durch gelesen und auch mal bei MS docs nachgelsen, es sollte mit dem nuget Pack aus dem Link oben gehen. Kann es aber leider erst nach Weihnachten testen.
    "Hier könnte Ihre Werbung stehen..."

    MichaHo schrieb:

    Kann es aber leider erst nach Weihnachten testen.

    Bin gespannt.

    Da ich die Tage auch ein Projekt versuche zu .Net Core zu portieren werde ich es auch bald sehen obs geht *gg*

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Also die ganzen Viewmodels, Models, Context, DataProvider und logic funktioniert out of the box genauso wie mit .net standard.
    beim WPF Core Projekt bin ich mir nicht ganz sicher ob da nicht zu viele Windows spezifische namespaces importiert sind.
    bisher hatte ich bis auf das Gruppieren aber null Probleme. Außer das der Designer mächtig rum spinnt. Weshalb ich meist nur den Xaml teil eingeblendet habe und die Anwendung halt starte um die Änderung zu sehen.

    ich arbeite in diesem Projekt übrigens mit EFCore und Sqlight, das klappt hervorragend.
    "Hier könnte Ihre Werbung stehen..."
    Hi @Nofear23m
    ich habe die Filterung nun eingebaut. Allerdings etwas unkonventionell.
    Das mit der IcollectionView in .Net Core bekomme ich nicht hin.
    Man müsste ja auch das nuget Pack Microsoft.sdk.contracts installieren und das wiederum gibt mir den Namespace Windows.Ui.Data ins Viewmodel, find ich unschön.
    Bin daher einen enaderen weg gegangen. Habe in meinem Provider eine weitere Methode hinzugefügt die mir die gefilterte Liste zurück gibt.
    Im Viewmodel kann ich dann entwder die gefilterte Liste holen, oder die ganze Liste.
    Sieht dann so aus:
    Im Provider:

    C#-Quellcode

    1. public List<TimeEntry> GetFilteredList(int id, DateTime startDate, DateTime endDate)
    2. {
    3. return Context.TimeEntries.Where(p => p.PersonId == id && p.Date >= startDate && p.Date <= endDate).Include(p => p.Person).ThenInclude(p => p.Company).ToList();
    4. }


    In der Logic dann:

    C#-Quellcode

    1. public static List<TimeEntry> GetFilteredPersonTimeEntries(int id, DateTime startDate, DateTime endDate)
    2. {
    3. using (var prov = new TimeEntriesProvider())
    4. {
    5. return prov.GetFilteredList(id, startDate, endDate);
    6. }
    7. }


    im ViewModel hab ich dann ein Property IsFilterActive was ich über einen ToggleButton setze und in der Filter Methode dann:

    C#-Quellcode

    1. private void Filter()
    2. {
    3. if (IsFilterActive)
    4. GetFilteredTimeEntries();
    5. else
    6. GetTimeEntries();
    7. OnPropertyChanged(nameof(TimeEntries));
    8. }


    Klappt hervorragend.
    hier noch 2 Bildchen:
    "Hier könnte Ihre Werbung stehen..."
    Hallo @MichaHo

    Ich habe die Tage erst ein sehr großes ViewModel mit ICollectioView`s und der gleichen zu .Net Core Migriert und hatte keinerlei probleme. Nada.
    Irgendwas passt da bei dir nicht. Poste doch mal den Inhalt deiner *.csProj.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Hi,
    kann ich machen:

    hier die .csproj vom ViewModel Projekt

    XML-Quellcode

    1. <Project Sdk="Microsoft.NET.Sdk">
    2. <PropertyGroup>
    3. <TargetFramework>netcoreapp3.0</TargetFramework>
    4. </PropertyGroup>
    5. <ItemGroup>
    6. <ProjectReference Include="..\..\Data\Logic\TimeTracker.Data.Logic\TimeTracker.Data.Logic.csproj" />
    7. </ItemGroup>
    8. <ItemGroup>
    9. <PackageReference Include="Ninject" Version="3.3.4" />
    10. </ItemGroup>
    11. </Project>


    mein Projket kennt von Haus aus keine IcollectionView. wenn ich Strg+. drücke, möchte VS das WindowsBase.dll nuget Paket installieren.
    Kann mich aber erinnern das Du mal gesagt hast das das nicht sein soll weil die WindowsBase.dll eine Refernz zur UI ist.
    "Hier könnte Ihre Werbung stehen..."
    Ahhhh, OK.

    Mach mal .Net Core 3.1 und alles wird gut sein denke ich.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    OK, Danke Dir, probiere ich aus. Muss erstmal VS updaten

    EDIT: So, Projekt ist nun auf Net Core 3.1
    Muss ich dann noch irgendwas referenzieren? ICollectionView kennt es nicht.
    "Hier könnte Ihre Werbung stehen..."

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „MichaHo“ ()