Kleines Programm -Großes Problem.

  • WPF

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von hlghyr.

    Kleines Programm -Großes Problem.

    Hallo Forum!
    Ein kleines Programm, wo nur ein Polygon angezeigt werden soll. Im VM wird nur ein String erzeugt und und an eine Basiskasse in die Proeprty gereicht. Beim Debuggen kann ich den Verlauf der Daten nachvollziehen. Diese landen im Setter und werden auch übernommen. Alles scheint in Ordnung. auch die Basisklasse mit den NotifyPopC wird angesprochen. Aber nicht einmal in der TextBox werde Daten angezeigt. Wenn ich jetzt aber Den String direkt der Priv.Feld gebe, funktioniert die anzeige aber.
    Ich geb euch mal den Code:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.ComponentModel
    2. Imports System.Runtime.CompilerServices
    3. Public Class NotifyPropC
    4. Implements INotifyPropertyChanged
    5. Public Event PropertyChanged(sender As Object, e As PropertyChangedEventArgs) Implements INotifyPropertyChanged.PropertyChanged
    6. Public Sub NotifyPropertyChanged(<CallerMemberName()> Optional ByVal propertyName As String = Nothing)
    7. RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName))
    8. End Sub
    9. End Class

    VB.NET-Quellcode

    1. Public Class ViewModel
    2. Inherits ModelString
    3. Private vers As New ModelString
    4. Public Sub New()
    5. vers.Liste = "12,45 157,129 265,159"
    6. End Sub
    7. End Class

    VB.NET-Quellcode

    1. Public Class ModelString
    2. Inherits NotifyPropC
    3. Public Sub New()
    4. End Sub
    5. Private _liste As String ' = "12,45 157,129 265,159"
    6. Public Property Liste() As String
    7. Get
    8. Return _liste
    9. End Get
    10. Set(ByVal value As String)
    11. _liste = value
    12. NotifyPropertyChanged()
    13. End Set
    14. End Property
    15. End Class

    VB.NET-Quellcode

    1. Class MainWindow
    2. Public Sub New()
    3. ' Dieser Aufruf ist für den Designer erforderlich.
    4. InitializeComponent()
    5. ' Fügen Sie Initialisierungen nach dem InitializeComponent()-Aufruf hinzu.
    6. End Sub
    7. End Class

    XML-Quellcode

    1. <Window x:Name="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:local="clr-namespace:TestWpfPolygonPointCollection"
    5. Title="MainWindow" Height="350" Width="525">
    6. <Grid>
    7. <Grid.DataContext>
    8. <local:ViewModel/>
    9. </Grid.DataContext>
    10. <Canvas Background="#FFF9F8E9">
    11. <Polygon Fill="#FFD5D8FD" Points="{Binding Liste, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Panel.ZIndex="10"/>
    12. <TextBox Canvas.Left="359" Canvas.Top="291" Width="148" Text="{Binding Liste, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
    13. <TextBox.DataContext>
    14. <local:ModelString/>
    15. </TextBox.DataContext>
    16. </TextBox>
    17. </Canvas>
    18. </Grid>
    19. </Window>



    Das Projekt hab ich auch noch ran gehangen.
    Ich hoffe, ihr könnt mir sagen was ich falsch gemacht habe.
    MfG hlghyr
    Dateien
    ViewModel hat keine Liste-Property. Sind die Bindings mit Binding-Picking im Xaml-Editor gesetzt?

    Und die Textbox soll sicher ans selbe Viewmodel gebunden sein wie das Polygon. Daher darf sie nicht ihren DataContext selbst instanzieren.

    XML-Quellcode

    1. <TextBox.DataContext>
    2. <local:ModelString/>
    3. </TextBox.DataContext>
    muss weg.

    mach dir klar:

    XML-Quellcode

    1. <TextBox.DataContext>
    2. <local:ModelString/>
    3. </TextBox.DataContext>
    entspricht in VB:

    VB.NET-Quellcode

    1. Textbox1.DataContext = New ModelString
    - es ist eine Instanzierung!

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

    Hi!
    Ich denke mal, das ich die Liste-Property nicht brauche, da ich keine Liste anlegen will. Das Polygon kann die Punkte als einen String annehmen. Wobei ein bestimmtes Format eingehalten werden muss. Das mit den DataContex ist ein Versehen. Ich hatte schon Stunden lang alles mögliche ausprobiert und davon muss es wohl noch ein Überbleibsel sein. Sorry! Eigentlich benutze ich immer das Picking, auch wenn ich den DataContext anlege. Bis auf Styles gibt es da auch keine Probleme. Das Eigenartige ist ja jetzt bei meinen Problem, das mir alles angeboten wird, aber schon im Eigenschaftenfenster die Daten nicht zu sehen sind. Was aber normaler weise der Fall ist, wenn alles richtig gemacht wurde. Am XAML, bin ich mir sicher, wird es nicht liegen. Ich glaube, das ich beim instanziieren oder deklarieren was nicht richtig mache. Aber was???
    MfG hlghyr
    Dein Polygon bindet an "Liste". Liste ist eine Eigenschaft der Klasse ModelString, von der auch dein VM erbt. Allerdings wird diese Property bzw. das Feld dahinter nie initialisiert, es wird nie ein Wert zugewiesen.

    Was du machst, ist in deinem VM ein ModelString zu instanzieren und diesem seine Liste zuzuweisen, allerdings ist das ja nicht an das Polygon gebunden.

    Eine Lösung: _liste im ModelString protected machen (ist wie private, aber noch für vererbte Klassen erreichbar) und dann im Konstruktor anstatt vers.Liste = "12,45 157,129 265,159" so initialisieren:

    VB.NET-Quellcode

    1. _liste = "12,45,157,129,265,159"
    (und vergess das Komma nicht)
    Verschont mich, wenn ich etwas falsch gesehen habe.
    Hi EDR!
    Mein Binding funktioniert. Da bin ich mir sicher. Das Problem ist, das ich wohl was beim instanziieren oder beim deklarieren falsch mache. Wie soll ich sagen, ich bekomme die Werte nicht vom VM in den Eigenschaftsmember vom M. Sie gehen zwar rein aber bleiben nicht drin.
    Ich hatte im ersten Post ein Projekt mit ran gehängt.
    MfG hlghyr
    ok, jetzt habichs mühselig gedowngraded auf 2010, und - was soll ich sagen - es funktioniert.
    oder was soll daran anners funktionieren?
    man ändert die koordinaten, und das poligon ändert sich mit.

    nu kann man diesen komischen ModelString rausschmeissen, und im vereinfachten ViewModel eine vernünftige Benamung einführen (und die Bindings anpassen):

    VB.NET-Quellcode

    1. Public Class ViewModel
    2. Inherits NotifyPropC
    3. Private _PointsDefinition As String = "12,45 157,129 265,159"
    4. Public Property PointsDefinition() As String
    5. Get
    6. Return _PointsDefinition
    7. End Get
    8. Set(ByVal value As String)
    9. _PointsDefinition = value
    10. NotifyPropertyChanged("PointsDefinition")
    11. End Set
    12. End Property
    13. End Class
    Dateien

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Hi!
    EDR! Danke für die Mühe! Das es so funktioniert, hatte ich aber im ersten Post geschrieben. Mein Problem ist, das ich vom VM aus die Daten auch einfügen möchte. Ich hab noch mal ein kleines Beispiel ran gehangen. Da kann man genauer sehen, was ich meine. Auf den ersten Blick scheint alles zu funktionieren. Bei Dateneingabe werden die Punkte hinzugefügt. Doch wenn ich auf den Button drücke, sollte eigentlich ein anderer String geladen werden. Das ButtonCommand landet im VM und von da aus möchte ich auf die Eigenschaften im M zugreifen um diese einen neuen String zu zuweisen. Das bekomme ich einfach nicht hin. Warum möchte ich das so haben? Es wird später noch mehr dieser M-Klassen geben. Die Daten zur Verfügung stellen aber auch welche empfangen müssen. Naja und wenn es schon bei vielleicht 15 Zeilen hapert, brauch man bloß mal hoch rechnen wie es dann vielleicht bei 1000 aussieht.
    Im folgenden Beispiel ist noch die alte INotifyPropertyChanged-Klasse drin. Hatte nur probiert, ob es an der anderen lag.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class ViewModel
    2. Inherits ModelString
    3. Dim Alt As New ModelString
    4. Public Property VersCommand As ICommand
    5. Public Sub New()
    6. VersCommand = New DelegateCommand(Sub(o) vers())
    7. End Sub
    8. Private Sub vers()
    9. Alt.zurueckSetzen("12,45 157,129 265,159 245,125 478,356")
    10. 'MessageBox.Show("Hi!")
    11. End Sub
    12. End Class

    VB.NET-Quellcode

    1. Public Class ModelString
    2. Inherits NotifyPropC
    3. Public Sub New()
    4. End Sub
    5. Public Sub zurueckSetzen(ByVal p1 As String)
    6. Liste = p1
    7. End Sub
    8. Private _liste As String
    9. Public Property Liste() As String
    10. Get
    11. If _liste = Nothing Then
    12. _liste = "12,45 157,129 265,159 235,125"
    13. End If
    14. Return _liste
    15. End Get
    16. Set(ByVal value As String)
    17. If _liste = value Then
    18. Else
    19. _liste = value
    20. OnPropertyChanged("Liste")
    21. End If
    22. End Set
    23. End Property
    24. End Class

    VB.NET-Quellcode

    1. <Window x:Name="window" x:Class="MainWindow"
    2. xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
    3. xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
    4. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    5. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    6. xmlns:local="clr-namespace:TestWpfPolygonPointCollection"
    7. Title="MainWindow" Height="350" Width="525">
    8. <Grid>
    9. <Grid.DataContext>
    10. <local:ViewModel/>
    11. </Grid.DataContext>
    12. <Canvas Background="#FFF9F8E9">
    13. <Polygon Fill="#FFD5D8FD" Points="{Binding Liste, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Panel.ZIndex="10"/>
    14. <TextBox Canvas.Left="127" Canvas.Top="291" Width="380" Text="{Binding Liste, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
    15. <Button Content="Alter Zustand" Command="{Binding VersCommand}" Canvas.Left="20" Canvas.Top="289" Width="89"/>
    16. </Canvas>
    17. </Grid>
    18. </Window>

    Zu diesen Beispiel gehört noch DelegateCommand-Klasse und die Klasse mit der INotifyPropertyChanged Schnittstelle.


    Hoffe, das man nun versteht was ich meine.
    MfG hlghyr
    Dateien
    es ist nervtötend, dass du in 2013 programmierst, und in deim Zip keine .sln enthalten ist.
    mit sln wärs einfach zu konvertieren - ohne isses mir zu mühsam.

    Aber der Fehler liegt in der Wirrsal mit deinem ModelString:
    Viewmodel erbt von ModelSTring, und Viewmodel enthält einen ModelString.
    An welchen Modelstring ist nun gebunden, und welcher Modelstring wird beim ButtonClick geändert?

    Keep it Simple! - das ist nicht nur son Spruch, sondern das ist eine lebenserhaltende Maßnahme.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Hi!
    Die Zipdateien sind ProjectTemplates. Hab noch mal kompletten Ordner angehängt. Warum steigt Du nicht auf VS 2013 um?
    Da ist mir noch Aufgefallen, das ich im Setter vom M ein If Then drin stehen hab. Kann eigentlich wieder raus.
    Hoffe, das es reicht.
    MfG hlghyr

    Edit: falsches Format im Anhang! Neue geladen.
    Edit Nr.2: Hab es hinbekommen. Nicht so wie ich es vorhatte, aber mit Methoden kann ich Leben.
    Dateien

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „hlghyr“ ()

    seit Tagen? Ich hab die Lösung doch erst um 17:24 gepostet.
    vlt. hast du das übersehen, denn es handelt sich um einen Edit im post von 17:18.

    ich kanns dir auch nochmal wiederholen:

    Viewmodel erbt von ModelSTring, und Viewmodel enthält einen ModelString (das sind nu 2 ModelStrings).
    An welchen Modelstring ist nun gebunden, und welcher Modelstring wird beim ButtonClick geändert?
    EDR:
    Das kann schon sein, das ich dadurch überlesen habe. Es ist nicht so, das ich mir keine Mühe gebe, wenn mal was nicht klappt. Bevor ich im Forum um Rat frage versuch ich es selber zu lösen. Dabei trifft man immer alte Bekannte oder auch Neue, wo man mal gehangen hat oder was man mal brauchen kann. Ich melde mich eigentlich nur, wenn ich wirklich keinen Rat mehr weis. Stehe ja nicht unter Leistungsdruck. Deshalb sitze ich schon so lange dran. Mein richtig großes Problem hatte ich letztens mit dem ItemsControl. Aber beim suchen der Lösung blieb gleich noch ein bißchen Styles, Animation usw. hängen. Es bringt nichts, wenn die Lösung geboten wird. Aber manchmal ist es ebend so, das man schon ein Schups in die richtige Richtung brauch. Auf jeden Fall wird ich mir das noch mal anschauen.

    MfG hlghyr