Support, Anregungen, Wünsche zur Tutorialreihe <WPF lernen/>

  • WPF MVVM

Es gibt 448 Antworten in diesem Thema. Der letzte Beitrag () ist von Nofear23m.

    Wenn dir das probleme bereitet können wir das hier ja angehen. Genau dafür ist der thread ja da.
    Wo hackt es denn??

    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. ##

    Hallo

    Update: Spät aber doch ein neues Kapitel. XAML Namespaces
    Hoffe es gefällt euch...

    Kritik ist auch immer gerne gesehen. Freue mich natürlich über jedes Hilfreich und/oder ein Kommentar auf YT.

    @Akanel Hast du nun noch fragen? PS: Habe versucht bei XAML das X besser zu betonen :D

    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. ##

    Ja ich habe noch ein paar Fragen, habe aber noch einige andere Sachen zu erledigen bevor ich mich wieder mehr mit der WPF beschäftigen kann.
    Ich komme aber sicher noch mit meiner Frage auf dich zu.

    EDIT:
    Ich hoffe Du hast mir das mit der "Semmel" nicht böse genommen.
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    Hallo

    Akanel schrieb:

    Ja ich habe noch ein paar Fragen

    Kein Thema. Kannst ja auch jederzeit einen thread im WPF Bereich aufmachen wenn es mehr ist.

    Akanel schrieb:

    Ich hoffe Du hast mir das mit der "Semmel" nicht böse genommen.

    Nene, ganz im Gegenteil. Auch Kritik ist von meiner Seite immer gerne gesehen. Nur so kann ich sowohl mich selbst verbessern als auch die Qualität des Tutorials nach oben setzen. Ausserdem sehe ich das ganze von einem anderen Blickwinkel. Ich mache das tut ja für die Community und nicht für mich. Es muss also für EUCH verständlich und gut ausgearbeitet sein. Wenn man also etwas schlecht versteht oder ich etwas vergessen habe, zu knapp besprochen habe oder Ihr der Meinung seit ich habe an einer Stelle nur Mist erzählt dann bitte sagt mir das auch. Aber es stimmt schon, ich habe bei den tuts von MS auch oft Semmel verstanden.

    Schöne 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. ##

    Hallo Sascha ,
    ich hab jetzt auch mal angefangen mich mit WPF auseinander zusetzten.
    Ich will es mal versuchen und hoffe mit deinem Tutorial weiter zukommen.
    Das ist jetzt schon der zweite Anlauf :S .

    Also ich hab hier deine PDF und versuche mich an DatatTemplate.

    Spoiler anzeigen

    XML-Quellcode

    1. <Window x:Class="MainWindow"
    2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    4. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    5. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    6. xmlns:local="clr-namespace:DataTemplate"
    7. mc:Ignorable="d"
    8. Title="MainWindow" Height="450" Width="800">
    9. <Grid>
    10. <ListBox ItemsSource="{Binding AutoListe}">
    11. <ListBox.ItemTemplate>
    12. <DataTemplate DataType="{x:Type local:Auto}">
    13. <Grid ShowGridLines="True">
    14. <Grid.ColumnDefinitions>
    15. <ColumnDefinition Width="60"/>
    16. <ColumnDefinition Width="*"/>
    17. </Grid.ColumnDefinitions>
    18. <Border Margin="5" BorderBrush="Black" BorderThickness="1">
    19. <Image Source="{Binding Logo}" Stretch="Uniform"
    20. Width="50" Height="50" RenderOptions.BitmapScalingMode="HighQuality"/>
    21. </Border>
    22. <StackPanel Grid.Column="1" Margin="5">
    23. <TextBlock Text="{Binding Path = Marke}"/>
    24. <TextBlock Text="{Binding Path = Modell}" Padding="3,0,0,0"/>
    25. <StackPanel>
    26. <TextBlock FontWeight="Bold">
    27. <Run Text="{Binding PS, FallbackValue=0}"/>
    28. <Run Text=" PS"/>
    29. </TextBlock>
    30. </StackPanel>
    31. </StackPanel>
    32. </Grid>
    33. </DataTemplate>
    34. </ListBox.ItemTemplate>
    35. </ListBox>
    36. </Grid>
    37. </Window>


    Folgendes Problem:

    Ich hab im Designer keine keine Vorschau.
    Zu Laufzeit zeigt er alles an.
    Warum? Was mach ich falsch?
    Was macht das Run in TextBlock
    Gibt es für XAML Sowas wie eine Beschreibung in der Intellisense,
    wie es in Winforms angezeigt wird?

    In deine Klasse Auto ist kleine Fehler (in der PDF)

    VB.NET-Quellcode

    1. Public Property Logo As String
    2. Public Sub New(marke As String, modell As String, ps As Integer, logo As Uri)
    3. Me.Marke = marke : Me.Modell = modell : Me.PS = ps : Me.Logo = logo
    4. End Sub


    String kann nicht in Uri konvertiert werden
    Hallo @Amro

    viele Fragen. Ich versuche jede zu beantworten :D

    Amro schrieb:

    ich hab jetzt auch mal angefangen mich mit WPF auseinander zusetzten.
    Ich will es mal versuchen und hoffe mit deinem Tutorial weiter zukommen.
    Das ist jetzt schon der zweite Anlauf .

    Das wird schon. Hast du denn die videos auch angesehen oder "nur" das PDF. Hier ist nicht immer alles enthalten. Zudem sieht man im Video auch Dinge wie Intellisense usw. dazu mehr unten.

    Amro schrieb:

    Ich hab im Designer keine keine Vorschau.
    Zu Laufzeit zeigt er alles an.
    Warum? Was mach ich falsch?

    Hast du den Designtime-Datacontext angegeben? Es gibt allerdings auch Situationen in welchen die Intellisense nicht ganz will. Erkläre ich eh auch im Video.
    Wie man den Designtime-DataContext angibt übrigens auch. Fall gewünscht suche ich dir gerne die Stelle raus. Gibt einfach bescheid.

    Amro schrieb:

    Was macht das Run in TextBlock

    Run ist ein Element in der WPF welches verwendet werden kann um Zeichenketten in einen TextBlock zu bekommen.
    Angenommen ich habe in meiner gebundenen Klasse ein Property Geburtstag. Nun möchte ich den Geburtstag aber mit dem Text "Der Benutzer hat am dd.mmm Geburtstag" anzeigen.
    Tja, einfach so kann man das nicht Binden. Zwei möglichkeiten entweder ich setze 3 TextBlöcke nebeneinander in einem StackPanel wie z.b.:



    Oder du sparst dir die ganzen TextBlöcke und das Stackpanel und verwendest Run. Das spart Controls, ist übersichtlicher und spart Systemresourcen.



    Amro schrieb:

    Gibt es für XAML Sowas wie eine Beschreibung in der Intellisense,
    wie es in Winforms angezeigt wird?

    Hier weis ich leider nicht genau was du meinst. Kanst du das bitte nochmal erleutern.

    Amro schrieb:

    In deine Klasse Auto ist kleine Fehler (in der PDF)

    Danke für den Hinweis. Wohl ein Copy&Paste-Fehler. Werd eich nachbessern. Danke dir.
    PS: Du kannst aus dem URI einen String machen.

    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. ##

    Hallo Sascha,


    Nofear23m schrieb:

    Hast du den Designtime-Datacontext angegeben?


    Das war das Problem :thumbsup:

    Mit den Videos ist das immer so eine Sache auf der Arbeit.
    Die kann ich mir nur Privat anschauen.
    Mein Internetanbieter bekommt es aber im moment nicht hin die Störung zu beheben :cursing: .

    Hab da nochwas , wenn du in den Videos auf F1 drückst landest du auf der deutschen MSDN.
    Ich bekomme nur die Englische . Also im XAML-Code Bereich.

    Ich werde deine Tuts weiter verfolgen und freue mich schon auf weitere Videos und PDF's.
    Super Tutorial :thumbup:
    Hallo

    Ja, auf Arbeit ist das blöd.
    Aber zuhause guck ich solche TutVideos am liebsten am Tablet. Da kann ich auch gemütlich am Balkon sitzen. *gg*

    Wegen F1:
    Hast du vieleicht die Englische Version von VS? Das wäre eine erklärung dafür das du die englische MSDN angeeigt bekommst.

    Achja. Ich denke ich weis jetzt was du mit der Hilfe unter Winforms meinst.
    Hab mal schnell wieder nach lange Zeit zum Testen ein Winforms Projekt erstellt. ;)
    Du meinst unten den kurzen Text zum jeweiligen Property richtig?

    Geht in WPF Projekten indem man mit der Maus drüber fährt. (Hover)

    PS: Hab hier auf der Arbeit auch die Englishe Version.

    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. ##

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

    Amro schrieb:

    Die nächste frage kommt bestimmt

    Kein Thema. Dafür ist der Thread ja da. Mich freut es einfach das ich dich den ein oder anderen dazu bringen kann sich mit der WPF zu beschäftigen. Ich weis, am Anfang steht man da wie du Kuh vorm neuen Tor aber es ist echt nicht so schlimm wie es Anfangs scheint.

    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. ##

    Ich dann doch schon vorab mal ein oder 2 fragen.
    Welches Verständnis von VB.net oder C# setzt du bei deinen Tutorials voraus? Mir persönlich passt es ganz gut das Du VB.net zeigst.

    Ich habe meine bisherigen kleinen Projekte meist Dataset only nach EDR programmiert. Das reicht mir und ich muss mich nicht noch zusätzlich mit SQL beschäftigen. Das wird irgendwann vielleicht kommen.
    Jetzt die frage, ist sowas wie Dataset only auch mit WPF möglich oder kommt da mehr auf mich zu. Möchte zum üben halt meine vorhandenen projekte in WPF umschreiben.
    Nach möglichkeit auch gleich richtig mit mvvm wenn möglich. Dazu muss ich aber noch etwas lesen da mir da noch einiges unklar ist. Denke das mvvm kann man später noch einbauen.
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    Hallo @Akanel

    Ich setzte im Grunde "nur" allgemeine OOP Programmierkenntnisse voraus. Wie in Kapitel 1.1 Einleitung auch angesprochen.

    Also allgemeine Kenntnisse in VB.Net, Vererbung, Interfaces usw.
    Aber.... ich werde auch wenn ich ein Interface das erste mal erstelle oder das erste mal eine Basisklasse erstelle oder von ihr ableite kurz erklären um was es geht und auch Links bereitstellen. Keine Angst.

    Was deine andere Sorge betrifft. Du bist in der WPF keinster Weise an irgendwas "gebunden". Das bedeutet aber auch das du deine DataTebles nicht per Clicki Bunti zusammenstellen kannst. So wie in WinForms einfach z.b. einen Timer auf die Form ziehen gibt es in der WPF nicht.
    Aber du wirst merken das es sogar "besser" geht. Durch das Bindingsystem erübrigt sich das ganze nämlich. Gerne kannst du einen Thread aufmachen solltest du hier schon mal "vorgreifen" wollen.

    Wenn du MVVM machst hast du (sollte sich um eine Datangestützte Anwendung handeln wo es sehr viel um CRUD geht) sowieso meist einen DataAccessLayer oder eine UnitOfWork dazwischen. Und ab da ist es egal von wo die Daten kommen. Und sollte es sich mal ändern, auch kein Problem. Dein VM bleibt das selbe. Einfach die DataAccess-Schicht getauscht und gut ists.

    Gerne kannst du wenn fragen aufgetaucht sind noch mehr Infos haben, hier wollte ich es jetzt nur mal grob anreißen.

    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, ich habe mir jetzt einiges zu den Begriffen "DataAccessLayer" durchgelesen. Wenn ich das alles richtig verstanden habe (ich gehe nicht davon aus) komme ich um das EF6 oder EFCore nicht drumherum. Und das ist bei weitem noch viel zu hoch für mich.
    DataAccessLayer hast Du in deiner Tutorialreihe ja auch so ziemlich zum Schluss. Ich denke das wird auch seinen Grund haben. Aber wie sieht das Grundsätzlich in der WPF aus? Wird da immer eine Datenbank genommen wenn es um Speichern von Datensätzen geht? Das wäre für meine Miniprojekte viel zu überzogen.
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    Hallo @Akanel

    Keine Sorge. So schlimm wie du es dir jetzt denkst ist es nicht.

    Akanel schrieb:

    Wenn ich das alles richtig verstanden habe (ich gehe nicht davon aus) komme ich um das EF6 oder EFCore nicht drumherum. Und das ist bei weitem noch viel zu hoch für mich.

    Erstmal hat ein DataAccessLayer nix mit ner DB zu tun. Ein DataAccessLayer wie der Name bereits sagt ist eine weitere Schicht. (DataAccessLayer -> Datenzugriffsschicht).
    Was bedeutet das jetzt im Groben.

    OK, nehmen wir mal MVVM. Was haben wir hier:
    M (Model) - V (View) - VM (ViewModel)
    ModelDie Modelklassen (Auto, Haus, usw.) Gerne auch POCO Klassen genannt. Das Model kennt im kein View und kein ViewModel.
    ViewDie Benutzeroberfläche. GUI Hier kann der USer interagieren, Buttons drücken usw. Ein Buttonklick führt dann z.b. einen Command im ViewModel aus. Die View kennt das ViewModel.
    Evtl. kennt sie das Model. Ich mache es gerne ohne das es das Model kennt, ist aber kein Fehler.
    ViewModelDas ViewModel kennt das Model aber nicht die VIEW!! Das ist wichtig.

    Wo wird sich der meiste code befinden? Also sowohl die Logik als auch alles was mit Datenbank/XML oder was auch immer für Zugriffen zu tun hat?
    Wo wird entschieden was das Programm macht wenn dieses oder jenes Ereignis eintritt? Genau. Im ViewModel!!!

    In der View hat es ja nix zu suchen, View ist ja nur das was dem User angezeigt wird. Im Model wohl auch nicht. Dann bleibt ja nicht mehr viel.

    Tja, wie man sich denken kann wir das ziemlich schnell recht voll dort. Schnell wächst eine ViewModel-Klasse an.
    Je nachdem wie viel Logik benötigt wird und wie viele Hilfsklassen es gibt um z.b. von einer Datenbank abrufen zu können.

    Abhilfe kann eine weiter Schickt schaffen. Eine Businesslogik beispielsweise. Das ist eine weitere Schicht über den ViewModel.
    Beispiel: Wenn ich in einer Lagerverwaltung ein Ersatzteil ausfasse gibt es Logik. Ich muss am Lagerstand die Menge abziehen. Nachsehen ob dieses Teil vieleicht auf den Kunden reserviert war und diese Reservierung löschen (er hats ja jetzt bekommen). Muss evtl. nachbestellen da nun vieleicht die Mindestmenge unterschritten wurde usw. All diese Logik muss nicht unbedingt in das ViewModel. Sie kann in die Businesslogik.
    Im ViewModel sage ich dann nur sowas wie. If Teilausfassen(artikelnummer, kundennummer) Then blabla.

    OK. Die Logik wird mir jetzt abgenommen. Was ist jetzt mit den Daten. Wie werden die hin und her geschaufelt wenn sich nun die Businesslogik drum kümmert. Die kann das eigendlich direkt machen. Oder? Ja, kann sie. Es ist mal wichtig zu wissen. Wie speichern? Wie abrufen?

    Also machen wir uns mal Gedanken darüber. Evtl. ist es sogar so das ich sage ich möchte nicht mit meinem Programm anfangen und dann in der mitte merken das ich mit XML doch nicht so gut "auskomme" und dann doch wieder auf DB ausweichen. Oder ich fange mit DB an und merke das ich hier dann ein Sicherheitsproblem bekomme oder der Kunde meint das es doch toll wäre wenn man die DB auch an anderen stellen verwenden könnte. Also machen wir ein Webservice und müssen nun dieses um die Daten bemühen.

    Ja, jetzt darfst du alle ViewModels umschreiben. Also Zeile für Zeile durchgehen wo du Datenbankabfragen drinnen hast und diese umschreiben damit nun vom Webservice abgerufen wird.

    Man kann also einen DataAccessLayer vor die Businesslogik machen.
    Die Businessslogik fragt also den DataAccessLayer um Daten und dieser übergibt diese. Oder speichert sie. So ist alles voneinander getrennt.
    Der DAL stellt beispielsweise eine Methode bereits welche sagt. ZieheLagerstandab(artikelnummer) oder LöscheReservierung(artikelnummer, kundennummen) usw.
    Das kann noch weiter so betrieben werden. Je nachdem wie umfangreich und groß eine Anwendung wird/werden kann.
    Ich habe schon Anwendungen geschrieben die hatten nach dem DAL noch eine Generische Repositoryschicht davor. Aber das ich eine andere Geschichte.

    Mach dir jedenfalls nicht so viele Gedanken darüber. Im Grunde reicht es das du weis das es die Möglichkeit gibt. Wenn du mit Pattern wir MVVM anfängst wirst du lange nicht in die Versuchung kommen solch eine Abstrahierung durchzuführen. Das ist nur nötig wenn dir Anwendung größer wird. Deshalb habe ich es ziemlich am ende. Da sollte alles andere bereits "sitzen". Also bitte nicht daran "festhalten"!!!!

    Akanel schrieb:

    DataAccessLayer hast Du in deiner Tutorialreihe ja auch so ziemlich zum Schluss. Ich denke das wird auch seinen Grund haben. Aber wie sieht das Grundsätzlich in der WPF aus? Wird da immer eine Datenbank genommen wenn es um Speichern von Datensätzen geht? Das wäre für meine Miniprojekte viel zu überzogen.

    Was du zum speichern nimmst bleibt völlig dir überlassen. Du wirst sehen wenn wir dann dazu kommen. Wie du Daten hast ist in der WPF meiner Meinung nach sogar viel weniger wichtig als unter WinForms. Ich finde es ist in der WPF viel übersichtlicher mit Daten umzugehen. EF ist einfach ein gutes und leicht zu lernendes System mit großeren Datenmengen zu hantieren. Es kann allerdings auch wieder sooo viel das es Bücher füllt.

    Im Grunde bleibt es dir selbst über. Naja, oder dem Kunden. Wenn er dir eine vorhandene REST API hinklatscht und meint: "Das sind die Daten" machen sie mir eine App. Naja, dann musst du mit den Daten was anfangen.

    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. ##

    Hallo Leute

    Der nächste Teil ist gerade freigeschaltet worden.
    Würde mich über Feedback freuen.

    Für den nächsten Teil benötige ich eure Hilfe.
    Binding! Was ist euch am Bindingsystem am wenigsten klar? Was wollt Ihr sehen?
    Wie weit soll ich ins Detail gehen? (Das Bindingsystem in der Tiefe erklärt oder reicht es euch wenn ich erkläre wie es funktioniert und es anzuwenden ist?)

    Evtl. mache ich am Ende vom Bindingkapitel einen Livestream wo Ihr dann eure Fragen stellen könnt. Ich denke das Binding ist in der WPF mitunter eines der wichtigsten Dinge.
    Sollte es ein paar voranmeldungen geben überlege ich mir was für euch. =O

    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. ##

    Hallo Sascha,

    erstmal ein großes Kompliment für Dein Tutorial. Echt super!! :thumbsup:

    Also mich würde zum Thema Binding folgendes interessieren:

    Zusammenhänge und Verwendung von Datacontext, Itemssource, Path,
    Elementname, XPath, DisplayMemberPath

    Wo setze ich am besten den Datacontext? Wie verwende ich Itemssource?
    Was ist der Path? Datenbindung zur Entwurfszeit usw.

    Vielleicht kannst Du auf dieses Thema etwas intensiver eingehen. Danke! Freue mich schon auf die nächste Folge.
    Hallo und Danke @Thomi

    Danke für die Blumen das freut natürlich.

    Ich fasse zusammen:
    • DataContext und deren Verwendung (wo und wann den Context setzen, wo lieber nicht)
    • Listen binden (ItemssSource) und deren Zusammenhänge (DisplaymemberPath, SelectedItem, usw.)
    • Unterschied zwischen Path und XPath
    • Binding zur Entwufszeit (Designtime)

    Werde diesen Punkten schon mal etwas mehr Aufmerksamkeit widmen. Danke dir sher für den Input, vieleicht kommt ja noch was von anderen denn jetzt sollte ich dann mal Anfangen.

    Schöne 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. ##

    Ich habe zum Beispiel ein Problem mit Binding eines DataGrid und ich warte auch schon auf das Kapitel Binding von dir :)
    Ein Beispiel: Das DataGrid bildet eine Woche ab, wo von Montag bis Sonntag z.B. immer die Columns gleiche Spaltengruppen aufweisen...
    Spoiler anzeigen

    XML-Quellcode

    1. <DataGrid ItemsSource="{Binding Source={StaticResource cvsDaten}}">
    2. <DataGrid.Columns>
    3. <!--Montag-->
    4. <DataGridTemplateColumn Width="*">
    5. <DataGridTemplateColumn.CellTemplate >
    6. <DataTemplate>
    7. <my:WeekPlanColumn Employee="{Binding Path=Name0}" Cycle="{Binding Path=Zyklus0}" Note="{Binding Path=Notiz0}"/>
    8. </DataTemplate>
    9. </DataGridTemplateColumn.CellTemplate>
    10. </DataGridTemplateColumn>
    11. <!--das Ganze wiederholt sich bis Sonntag-->
    12. </DataGrid.Columns>
    13. </DataGrid>

    Diese Gruppe möchte ich mit einem UserControl abbilden...
    Spoiler anzeigen

    XML-Quellcode

    1. <UserControl x:Class="uclWeekPlanColumn"
    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. mc:Ignorable="d">
    7. <Grid>
    8. <Grid.ColumnDefinitions>
    9. <ColumnDefinition Width="*"/>
    10. <ColumnDefinition Width="25"/>
    11. <ColumnDefinition Width="25"/>
    12. </Grid.ColumnDefinitions>
    13. <TextBlock Text="{Binding Employee, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type my:uclWeekPlannerPlanCell}}}"/>
    14. <TextBlock Grid.Column="1" Text="{Binding Cycle, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type my:uclWeekPlannerPlanCell}}}"/>
    15. <TextBlock Grid.Column="2" Text="{Binding Note, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type my:uclWeekPlannerPlanCell}}}"/>
    16. </Grid>
    17. </UserControl>

    Damit aber das Binding zu den einzelnen Zellen im UserControl funktioniert, habe ich folgende Klasse eingeschoben...
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class WeekPlanColumn
    2. Inherits uclWeekPlannerColumn
    3. Public Property Employee As String
    4. Get
    5. Return DirectCast(GetValue(EmployeeProperty), String)
    6. End Get
    7. Set(value As String)
    8. SetValue(EmployeeProperty, value)
    9. End Set
    10. End Property
    11. Public Shared ReadOnly EmployeeProperty As DependencyProperty = DependencyProperty.Register("Employee",
    12. GetType(String),
    13. GetType(WeekPlanColumn),
    14. New FrameworkPropertyMetadata("", FrameworkPropertyMetadataOptions.AffectsMeasure))
    15. Public Property Cycle As String
    16. Get
    17. Return DirectCast(GetValue(CycleProperty), String)
    18. End Get
    19. Set(value As String)
    20. SetValue(CycleProperty, value)
    21. End Set
    22. End Property
    23. Public Shared ReadOnly CycleProperty As DependencyProperty = DependencyProperty.Register("Cycle",
    24. GetType(String),
    25. GetType(WeekPlanColumn),
    26. New FrameworkPropertyMetadata("", FrameworkPropertyMetadataOptions.AffectsMeasure))
    27. Public Property Note As String
    28. Get
    29. Return DirectCast(GetValue(NoteProperty), String)
    30. End Get
    31. Set(value As String)
    32. SetValue(NoteProperty, value)
    33. End Set
    34. End Property
    35. Public Shared ReadOnly NoteProperty As DependencyProperty = DependencyProperty.Register("Note",
    36. GetType(String),
    37. GetType(WeekPlanColumn),
    38. New FrameworkPropertyMetadata("", FrameworkPropertyMetadataOptions.AffectsMeasure))
    39. New FrameworkPropertyMetadata("", FrameworkPropertyMetadataOptions.AffectsMeasure))
    40. End Class

    Ich glaube, dass dieses Unterfangen sicher noch besser abwickelbar ist...
    Wäre zum Beispiel auch ein Teil deines Binding-Tuts - denke ich...

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

    Hallo @VB1963

    Erstmal danke für dein Interesse.
    Ja, DataGrid ist ein wichtiges Thema und werde ich auch im groben durchgehen. Im groben deshalb weil das DataGrid im Grunde so viel kann das man hier eine eigene mehrteilige Reihe machen könnte.

    Ich nehme es auf jeden Falll als Thema auf. Dein "Problem" ziehlt eher sogar schon auf MVVM ab.
    Kurz zu deinem Problem:

    Ich habe zum besseren Verstädniss wieder mit Fahrzeugen gearbeitet:

    Du machst es dir im Grunde zu schwer. Das muss gar nicht umständlich über DependencyProperties gemacht werden.

    Ein userControl welches an eine MARKE representiert:

    XML-Quellcode

    1. <UserControl x:Class="uclMarkeCell"
    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:TestBinding"
    7. xmlns:vm="clr-namespace:TestBinding.ViewModel"
    8. mc:Ignorable="d"
    9. d:DesignHeight="300" d:DesignWidth="300" d:DataContext="{d:DesignInstance IsDesignTimeCreatable=True, Type=vm:MarkeVm}">
    10. <Grid>
    11. <Border Background="{Binding Color,Mode=OneTime}" Opacity="0.5"></Border>
    12. <DockPanel >
    13. <Image Source="{Binding ImageUrl,Mode=OneTime}" DockPanel.Dock="Top" MaxHeight="100"/>
    14. <TextBlock Text="{Binding Bezeichnung,Mode=OneWay}" FontSize="30" FontWeight="Bold" DockPanel.Dock="Bottom" Margin="3" HorizontalAlignment="Center"/>
    15. </DockPanel>
    16. </Grid>
    17. </UserControl>


    Und dann einfach ins DataGrid und gut ists:

    XML-Quellcode

    1. <DataGrid ItemsSource="{Binding Fahrzeuge}" IsSynchronizedWithCurrentItem="True" AutoGenerateColumns="False" CanUserAddRows="False">
    2. <DataGrid.Columns>
    3. <DataGridTemplateColumn MinWidth="100" Header="Marke">
    4. <DataGridTemplateColumn.CellTemplate >
    5. <DataTemplate>
    6. <local:uclMarkeCell DataContext="{Binding Marke,Mode=OneWay}"/>
    7. </DataTemplate>
    8. </DataGridTemplateColumn.CellTemplate>
    9. </DataGridTemplateColumn>
    10. <DataGridTextColumn Header="Modell" Binding="{Binding Modell,Mode=OneWay}" FontSize="30" FontWeight="Bold"/>
    11. </DataGrid.Columns>
    12. </DataGrid>


    Mehr benötigt es eigendlich nicht. anbei die Solution. Wenn du fragen hast dann einfach her damit, genauer dann im Tutorial :P

    Schöne Grüße
    Sascha
    Dateien
    • TestBinding.zip

      (65,98 kB, 87 mal heruntergeladen, zuletzt: )
    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. ##