bekomme kein Binding zustande

  • WPF

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

    bekomme kein Binding zustande

    Hallo!

    Da mein letzter Beitrag nicht mehr den passenden Titel trägt, eröffne ich ein neues Thema.
    Seit Tagen versuche ich ein Binding zu erstellen. Nun hab ich mich für den Weg direkt über den Code Behind und Bindung auf eine Klasse entschieden. Aber es klappt nicht.

    VB.NET-Quellcode

    1. Imports System.ComponentModel 'nötig für das Implements INotifyPropertyChanged
    2. Imports System.Runtime.CompilerServices
    3. Imports System.Collections.ObjectModel
    4. Namespace Namespace_Klasse01 'Der Namespace muss der Klasse manuell hier hinzugefügt werden. Über "Namespace_Klasse01" wird dieser in der XAML des Fensters dann eingefügt
    5. Public Class Klasse_Namen
    6. Implements INotifyPropertyChanged 'installiert vermutlich die Events erstmal, über das System wird die Oberfläche über die Änderung eines Propertys informiert, Ein hieran gebundenens Label z.B. liest dann seinen Text neu ein
    7. Private _TestText As String 'eine temporäre Variable für das eigentliche Property, Privat => nur in dieser Klasse verfügbar
    8. Public Property TestText As String 'ein Property namens TestText erstellen, soll global erreichbar sein, Hier liegt dann der gewünscht Text drin
    9. Get 'lesen
    10. Return _TestText 'dem Property seine temp Variable übergeben?
    11. End Get
    12. Set(value As String) 'schreiben
    13. _TestText = value 'temp Variable = übergebener Wert
    14. RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("")) 'Änderung des Property melden, an ME => die Klasse, ("") führt zur Aktualisierung aller Bindings der Klasse (hoffentlich)
    15. End Set
    16. End Property
    17. Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged 'wird durch Einfügen von "Implements INotifyPropertyChanged" automatisch hier eingefügt
    18. End Class
    19. End Namespace



    XML-Quellcode

    1. <Window x:Class="GuckFenster"
    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:Binding_Lager02"
    7. xmlns:nskn="clr-namespace:Binding_Lager02.Namespace_Klasse01"
    8. mc:Ignorable="d"
    9. Title="GuckFenster" Height="450" Width="800">
    10. <Window.Resources>
    11. <nskn:Klasse_Namen x:Key="myDataSource"/>
    12. </Window.Resources>
    13. <Grid>
    14. </Grid>
    15. </Window>


    Im XAML zeigt die Zeile " <nskn:Klasse_Namen x:Key="myDataSource"/>" "Der Name Klasse_Namen ist im Namespace ... nicht vorhanden".
    Ich versteh nicht warum. Ich habe den Aufbau mehrfach mit dem Beispielprojekt von nofear23m verglichen, sehe aber meinen Fehler nicht. Im Grunde scheint doch alles bisher so nachgebaut zu sein wie im Beispiel.

    Wäre für Hilfe echt dankbar. ;(

    Gruß

    eddi

    eichseinet schrieb:

    ("") führt zur Aktualisierung aller Bindings der Klasse (hoffentlich)

    Ne, tut es nicht. übergibst du allerding Nothing würde die View ALLE Properties an die gebunden wurde aktualisieren. Wissen auch wenige.
    Ist aber perfomancetechnisch eher naja. Du solltest eigendlich immer den Namen des Property übergeben damit die WPF weis welches Binding aktualisiert werden muss. Wie soll sie es sonst wissen.
    In meine Beispielen verwende ich immer: RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(NameOf(MeinProperty))
    So hast du auch Compilerprüfung und die Refactoringfunktionen der IDE zur Verfügung.

    eichseinet schrieb:

    Ich habe den Aufbau mehrfach mit dem Beispielprojekt von nofear23m verglichen, sehe aber meinen Fehler nicht.

    Naja. Nicht wirklich oder? Ich gebe doch keine DataSource in den Window.Resources an, sondern den DataContext.

    Kannst du aber auch von der CodeBehind mit Me.DataContext = Me

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

    VB.NET-Quellcode

    1. Namespace TestClasses
    2. Public Class DayInfo
    3. Implements INotifyPropertyChanged
    4. Public Sub New()
    5. If DesignerProperties.GetIsInDesignMode(New DependencyObject) Then
    6. GreetingText = "Hallo, wie geht es dir zur Designtime?"
    7. CurrentDate = DateTime.Today()
    8. MeetingsToday = New ObservableCollection(Of Meeting) From {
    9. New Meeting("Besprechung mit Franz", New Date(CurrentDate.Year, CurrentDate.Month, CurrentDate.Day, 9, 30, 0), TimeSpan.FromMinutes(60)),
    10. New Meeting("Quartalsmetting", New Date(CurrentDate.Year, CurrentDate.Month, CurrentDate.Day, 13, 0, 0), TimeSpan.FromMinutes(90)),
    11. New Meeting("Abendessen mit Chef", New Date(CurrentDate.Year, CurrentDate.Month, CurrentDate.Day, 16, 0, 0), TimeSpan.FromMinutes(15))
    12. }
    13. TodayWeather = New WeatherInfo() With {.CurrentTemp = 23.5, .WindDirection = WindDirection.North, .Windspeed = 15}
    14. Else
    15. GreetingText = "Hallo, wie geht es dir an diesem schönen Tag?"
    16. CurrentDate = DateTime.Today()
    17. MeetingsToday = New ObservableCollection(Of Meeting) From {
    18. New Meeting("Besprechung mit Franz", New Date(CurrentDate.Year, CurrentDate.Month, CurrentDate.Day, 9, 30, 0), TimeSpan.FromMinutes(60)),
    19. New Meeting("Quartalsmetting", New Date(CurrentDate.Year, CurrentDate.Month, CurrentDate.Day, 13, 0, 0), TimeSpan.FromMinutes(90)),
    20. New Meeting("Abendessen mit Chef", New Date(CurrentDate.Year, CurrentDate.Month, CurrentDate.Day, 16, 0, 0), TimeSpan.FromMinutes(15))
    21. }
    22. TodayWeather = New WeatherInfo() With {.CurrentTemp = 23.5, .WindDirection = WindDirection.North, .Windspeed = 15}
    23. End If
    24. End Sub
    25. Private _greetingText As String
    26. Public Property GreetingText() As String
    27. Get
    28. Return _greetingText
    29. End Get
    30. Set(ByVal value As String)
    31. _greetingText = value
    32. RaisePropertyChanged()
    33. End Set
    34. End Property
    35. Private _currentDate As DateTime
    36. Public Property CurrentDate() As DateTime
    37. Get
    38. Return _currentDate
    39. End Get
    40. Set(ByVal value As DateTime)
    41. _currentDate = value
    42. RaisePropertyChanged()
    43. End Set
    44. End Property
    45. Private _meetingsToday As ObservableCollection(Of Meeting)
    46. Public Property MeetingsToday() As ObservableCollection(Of Meeting)
    47. Get
    48. Return _meetingsToday
    49. End Get
    50. Set(ByVal value As ObservableCollection(Of Meeting))
    51. _meetingsToday = value
    52. RaisePropertyChanged()
    53. End Set
    54. End Property
    55. Private _todayWeather As WeatherInfo
    56. Public Property TodayWeather() As WeatherInfo
    57. Get
    58. Return _todayWeather
    59. End Get
    60. Set(ByVal value As WeatherInfo)
    61. _todayWeather = value
    62. RaisePropertyChanged()
    63. End Set
    64. End Property
    65. Protected Overridable Sub RaisePropertyChanged(<CallerMemberName> Optional ByVal prop As String = "")
    66. RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(prop))
    67. End Sub
    68. Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged
    69. End Class



    XML-Quellcode

    1. <Window x:Class="BindToClass"
    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:tc="clr-namespace:_2_1_4_2_DataBinding.TestClasses"
    7. mc:Ignorable="d"
    8. Title="BindToClass" Height="402.331" Width="432.945">
    9. <Window.Resources>
    10. <tc:DayInfo x:Key="myDataSource"/>
    11. </Window.Resources>
    12. <ScrollViewer>
    13. <Grid>
    14. <StackPanel DataContext="{StaticResource myDataSource}" Margin="10" Language="de">
    15. <Label FontSize="20" Content="{Binding CurrentDate}"/>
    16. <TextBlock Text="{Binding GreetingText}"/>
    17. <ListBox ItemsSource="{Binding MeetingsToday}" Margin="10" MaxHeight="200" DisplayMemberPath="Title"/>
    18. <TextBlock DataContext="{Binding TodayWeather}">
    19. <Run Text="Es hat"/>
    20. <Run Text="{Binding CurrentTemp, StringFormat={}{0}°C}"/>
    21. <Run Text="bei einem Wind mit"/>
    22. <Run Text="{Binding Windspeed, StringFormat={}{0} km/h}"/>
    23. <Run Text="von"/>
    24. <Run>
    25. <Run.Style>
    26. <Style TargetType="Run">
    27. <Setter Property="Text" Value="unknown"/>
    28. <Style.Triggers>
    29. <DataTrigger Binding="{Binding WindDirection}" Value="North">
    30. <Setter Property="Text" Value="Norden"/>
    31. </DataTrigger>
    32. <DataTrigger Binding="{Binding WindDirection}" Value="East">
    33. <Setter Property="Text" Value="Osten"/>
    34. </DataTrigger>
    35. <DataTrigger Binding="{Binding WindDirection}" Value="South">
    36. <Setter Property="Text" Value="Süden"/>
    37. </DataTrigger>
    38. <DataTrigger Binding="{Binding WindDirection}" Value="West">
    39. <Setter Property="Text" Value="Westen"/>
    40. </DataTrigger>
    41. </Style.Triggers>
    42. </Style>
    43. </Run.Style>
    44. </Run>
    45. </TextBlock>
    46. <Button Content="Neuen Termin einfügen" Width="200" HorizontalAlignment="Left" Margin="5" Click="AddMeeting"/>
    47. </StackPanel>
    48. </Grid>
    49. </ScrollViewer>
    50. </Window>


    Aber ist das in diesem Teil denn nicht genauso gelöst? Der Namespace wird in XAML unter dem Namen TC eingebunden. xmlns:tc="clr-namespace:_2_1_4_2_DataBinding.TestClasses"

    Danach dann der Zugriff auf die DayInfo als Unterpunkt von TC. Wobei DayInfo doch die Klasse ist, die sich im Namespace "Testclasses" befindet. Oder passiert an anderer Stelle in dem Beispiel noch etwas, das ich hier nicht mache?

    eddi
    Hallo

    OK, wusste nicht das du dich auf mein Tutorial beziehst. Ich dachte nun an deinen letzten Thread. Sowas solltest du am besten dazuschreiben.

    Aber bei meinem Beispiel funktioniert auch alles.
    In deinem Beispiel im ersten Post ist ja kein Control welches gebunden ist, woher weist du als odas es nicht funzt?
    Wichtig ist hier wie in meinem Beispiel gut zu sehen den Datenkontext anzugeben.

    Hier: DataContext="{StaticResource myDataSource}"
    Wird der Datenkontext angegeben. Du die vererbung gilt dieser Datenkontext für alle Elemente darunter. Also alles was sich innerhalb von den StackPanel befindet.
    Gibt du den Datenkontext nicht an wird das Binding auch nicht funktionieren. Woher soll die WPF es denn wissen?
    Du könntest ja unter umständen zig DataSources haben.

    Ich hoffe das war verständlich.

    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 glaube du hast mich falsch verstanden. Ich habe dein Video nochmals angesehen und danach deinen Code aus dem Tuturial genau angesehen. Nachdem ich glaubte den größten Teil zu verstehen, hab ich begonnen den Code in einem Testprojekt nachzustellen; mit meinen eigenen Namen und Kommentaren.
    Als ich an dem Punkt ankam, der oben gepostet steht trat aber ein Fehler auf.
    Die Zeile " <nskn:Klasse_Namen x:Key="myDataSource"/>" meldet "Der Name Klasse_Namen ist im Namespace ... nicht vorhanden" (ist also mit ner gewellten Linie unterlegt).
    Daher hab ich erst gar nicht weiter gemacht. Natürlich ist noch alles unvollständig und es gibt noch keine Zuweisung. Die Fehlermeldung "finde den Namen nicht im namespace" ist ja erst grundlegend und hat nix mit den noch fehlenden Zuweisungen zu tun. (jedenfalls nicht soweit ich bisher durchblicke)
    Leider erkenne ich keinen Fehler bis zu diesem Punkt.

    Und dann wär da noch das Problem, dass ich nicht sehe wie man eine Datei anhängen kann (Projekt als .zip). Nur Bilder..

    Gruß

    eddi
    Der Namespace ist aber soweit korrekt eingebunden. 1x Kompilieren und dann sollte gut sein. Denn der Designer kennt die Klasse erdt nach der ersten erstellung.

    Mit "Erweiterte Antwort" kannst du Anhänge einfügen.

    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 glaub's nicht! :/
    Das war's! Ich wunder mich schon warum mir der Name sogar vorgeschlagen wird und dann nicht vorhanden sein soll. Im Nachhinein fällt mir auch wieder ein, dass in einem der Videos vom Erstellen mal die Rede war. Jetzt hab ich 4 Stunden einen Fehler gesucht, der eigentlich gar nicht da ist.
    Danke für die Hilfe.

    Gruß

    eddi
    Jaja, deshalb wichtig....
    Gut zuhören. Auch wenn man der Meinung ist ich rede blödsinn. Haha

    Schön das es jetzt klappt.
    Wenn du Fragen hast meldest dich hald.

    Solange ich verstehe auf was du hinaus willst kann ich auch helfen.

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