Label.Content an Property binden

  • WPF

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

    Label.Content an Property binden

    Nabend,

    ich bekomm es gerade einfach nicht hin einen LabelText an eine Klasse zu binden.

    Wieder aufgeräumt sieht der Test soweit aus.
    XML:
    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:WpfApp5"
    7. mc:Ignorable="d"
    8. Title="MainWindow" Height="450" Width="800">
    9. <Grid>
    10. <Label Name="testlabel"
    11. HorizontalAlignment="Left"
    12. VerticalAlignment="Top"
    13. FontSize="20"
    14. Content="{Binding test.CustomerName}"/>
    15. </Grid>
    16. </Window>


    VB:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Class MainWindow
    2. Private Sub MainWindow_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
    3. Test.CustomerName = "Hallo"
    4. End Sub
    5. End Class
    6. Public Class Test
    7. Private Shared customerNameValue As String
    8. Public Shared Property CustomerName() As String
    9. Get
    10. Return customerNameValue
    11. End Get
    12. Set(ByVal value As String)
    13. If Not (value = customerNameValue) Then
    14. customerNameValue = value
    15. End If
    16. End Set
    17. End Property
    18. End Class


    Kann mir da wer helfen?

    Danke und bleibt gesund!
    In Arbeit...
    Hallo

    Du hast den DatenContext des Fensters nicht gebunden.

    Me.DataContext = test

    Und beim Binding dann nur {Binding CustomerName}

    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

    Am Ende von MainWindow Loaded setzt du den Datenkontext dann sollte es klappen. Tippe gerade nur am Handy, sonst könnte ich es genauer beschreiben.

    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 gerade den Teil in deinem Tut gelesen.
    Vorher bin ich allerdings schon auf

    VB.NET-Quellcode

    1. Test.CustomerName = C.ToString
    2. testlabel.DataContext = New Test

    gekommen, aber ich frage mich ob ich jetzt nach jeder Wertänderung auch 'testlabel.DataContext = New Test' aufrufen muss oder ob das nur einmal am anfang geschehen muss.

    Dein Tut ist großartig und ich werde es mir in den LockdownTagen bei viel Freizeit mal reinziehen. :thumbsup:

    edit



    Hab es jetzt hinbekommen @Nofear23m und falls jemand auch solche Schwierigkeiten hat wie ich :whistling:

    XML:
    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:WpfApp5.WpfTestKlasse"
    7. mc:Ignorable="d"
    8. Title="MainWindow" Height="450" Width="800">
    9. <Window.DataContext>
    10. <local:Test x:Name="Te"/>
    11. </Window.DataContext>
    12. <Grid >
    13. <Label Name="testlabel"
    14. HorizontalAlignment="Left"
    15. VerticalAlignment="Top"
    16. FontSize="20"
    17. Background="{Binding CustomerColor}"
    18. Content="{Binding CustomerName}"/>
    19. </Grid>
    20. </Window>


    VB:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.ComponentModel
    2. Imports System.Runtime.CompilerServices
    3. Namespace WpfTestKlasse
    4. Public Class Test
    5. Implements INotifyPropertyChanged
    6. Private Timer As New Windows.Threading.DispatcherTimer With {.Interval = New TimeSpan(0, 0, 0, 1)}
    7. Private r As New Random
    8. Public Sub New()
    9. AddHandler Timer.Tick, AddressOf Timer_tick
    10. Timer.Start()
    11. End Sub
    12. Private _CustomerName As String
    13. Private Sub Timer_tick()
    14. CustomerName = Now.ToString
    15. CustomerColor = New SolidColorBrush(Color.FromArgb(r.Next(1, 255), r.Next(1, 255), r.Next(1, 255), r.Next(1, 255)))
    16. End Sub
    17. Public Property CustomerName() As String
    18. Get
    19. Return _CustomerName
    20. End Get
    21. Set(ByVal value As String)
    22. If Not (value = _CustomerName) Then
    23. _CustomerName = value
    24. RaisePropertyChanged()
    25. End If
    26. End Set
    27. End Property
    28. Private _CustomerColor As Brush
    29. Public Property CustomerColor() As Brush
    30. Get
    31. Return _CustomerColor
    32. End Get
    33. Set(ByVal value As Brush)
    34. If Not (value Is _CustomerColor) Then
    35. _CustomerColor = value
    36. RaisePropertyChanged()
    37. End If
    38. End Set
    39. End Property
    40. Protected Overridable Sub RaisePropertyChanged(<CallerMemberName> Optional ByVal prop As String = "")
    41. RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(prop))
    42. End Sub
    43. Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged
    44. End Class
    45. End Namespace
    In Arbeit...

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

    Hallo

    Klar, im XAML den DatenKontext setzen geht auch.

    Aber zu deinem Verständnis:

    Bei deinem Code oben:

    VB.NET-Quellcode

    1. Test.CustomerName = C.ToString
    2. testlabel.DataContext = New Test

    Wo instanziierst du denn Test? Von wo kommt die? und in der nächsten Zeile setzt du als DatenKontext eine NEUE Instanz. Das ist ja kontraproduktiv und ist so sicher nicht gewollt.
    Wenn Test irgendwo in deinem Code instanziiert ist dann sollte folgendes ja klappen:

    VB.NET-Quellcode

    1. Test.CustomerName = C.ToString
    2. testlabel.DataContext = Test


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

    Stimmt meine Annahme (das Thema ist mir noch neu) das 'Shared' nicht instanziiert werden muss und somit nur einmal existiert?

    Das wäre noch einmal eine Frage von von mir gewesen, weil ich oben in der TestClass alles mit Shared deklariert hab.
    Ich hab da gestern und heute noch dran gesessen und hab festgestellt das Test einmal erstellt und verbunden werden muss, was mir echt schwer fiel :whistling:

    Das Label hat ja auch die Property 'DataContext', warum oder wie kann man dort dort die Verbindung schaffen?

    XML-Quellcode

    1. <Window.DataContext>
    2. <local:Test x:Name="Te"/>
    3. </Window.DataContext>

    Bedeutet ja das die Klasse jetzt im xml global erreichbar ist oder?
    In Arbeit...
    Hallo

    vico255 schrieb:

    Stimmt meine Annahme (das Thema ist mir noch neu) das 'Shared' nicht instanziiert werden muss und somit nur einmal existiert?

    Aber genau damit kommen auch probleme, zumindest wenn man nicht damit umzugehen weis, lass das mit Shared am besten sein wenn es nicht unbedingt notwendig ist.

    vico255 schrieb:

    Das Label hat ja auch die Property 'DataContext', warum oder wie kann man dort dort die Verbindung schaffen?

    Ja, jedes DependencyObject in der WPF (also jedes Control) hat die Eigenschaft DataContext. Aber durch vererbung erbt jedes Control unter deinem Window (so auch dein Label) diesen. Gibst du also einen DataContext für ein Window an haben alle Elemente innerhalb dieses Fensters den DataContext.

    Aber schau dir einfach mal die Tutorials von mir über Binding an, falls du dazu Fragen hast gibt es ja auch den SupportThread des Tutorials.

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