Textbox via Combobox füllen

  • WPF

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Textbox via Combobox füllen

    Moin,

    ich kämpfe leider immer noch mit WPF und den Tücken der MVVM Pattern. Habe jetzt irgendwie komplett den Faden verloren. Ich wollte eine Combobox per XML füttern (das klappt auch soweit) und dann einen weiteren Wert gemäss der Auswahl in einer Textbox ausgeben aber irgendwie klappt das nicht. Mein Code sieht wie folgt aus:

    MainWindow.xaml

    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. Title="MainWindow" Height="150" Width="150">
    5. <Window.Resources>
    6. <XmlDataProvider x:Key="PersonalData" Source="Model\Mitarbeiter.xml" XPath="Mitarbeiter" />
    7. </Window.Resources>
    8. <Grid>
    9. <Grid.RowDefinitions>
    10. <RowDefinition Height="1*"/>
    11. <RowDefinition Height="1*"/>
    12. </Grid.RowDefinitions>
    13. <ComboBox Grid.Row="0" x:Name="cmbMitarbeiter" HorizontalAlignment="Left" Margin="10,10,0,0"
    14. VerticalAlignment="Top" Width="120" DisplayMemberPath="@PersonalID"
    15. ItemsSource="{Binding Source={StaticResource PersonalData}, XPath=./Person}"
    16. SelectedValuePath="@Vorname"
    17. SelectedValue="{Binding SelectedVornameValue}"
    18. />
    19. <TextBox Grid.Row="1" Text="{Binding SelectedVornameValue, FallbackValue=Vorname}"/>
    20. </Grid>
    21. </Window>


    MainViewModel.vb

    VB.NET-Quellcode

    1. Imports System.ComponentModel
    2. Imports System.Xml
    3. Public Class MainViewModel : Implements INotifyPropertyChanged
    4. Public Sub New()
    5. End Sub
    6. Public Sub New(Vorname As String)
    7. Me.SelectedVornameValue = _SelectedVornameValue
    8. End Sub
    9. Private _SelectedVornameValue As String
    10. Public Property SelectedVornameValue As String
    11. Get
    12. Return _SelectedVornameValue
    13. End Get
    14. Set(ByVal value As String)
    15. _SelectedVornameValue = value
    16. RaiseProp("SelectedVornameValue")
    17. End Set
    18. End Property
    19. Public Event PropertyChanged(sender As Object, e As PropertyChangedEventArgs) Implements INotifyPropertyChanged.PropertyChanged
    20. Public Sub RaiseProp(ByVal Propertie As String)
    21. RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(Propertie))
    22. End Sub
    23. End Class


    Mitarbeiter.xml

    XML-Quellcode

    1. <?xml version="1.0" encoding="utf-8" ?>
    2. <Mitarbeiter>
    3. <Person PersonalID="1" Vorname="Fritz" Nachname="Meier" />
    4. <Person PersonalID="2" Vorname="Max" Nachname="Mustermann" />
    5. <Person PersonalID="3" Vorname="Heinz" Nachname="Müller" />
    6. </Mitarbeiter>


    Irgendwie kann ich zwar in der Combobox die PersonalID auswählen aber die Textbox spuckt den Vornamen nicht aus.

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

    Das war das einzige Tutorial (XmLDataProvider) das ich gefunden habe das ich ansatzweise verstanden habe, alle anderen Beispiele waren teilweise viel zu kompliziert und für mich als "Anfänger" in Punkto WPF und MVVM nicht zu verstehen. Unter Window Forms habe ich das Ganze mit LinQ gelöst aber ich finde einfach kein einfaches und für Laien verständliches Beispiel wie man das unter WPF und MVVM lösen könnte.

    Es geht hier ja um Grundlagen und klar könnte man was basteln mit Code-Behind aber das kann es ja nicht sein ... denn dann könnte man gleich bei Window Forms bleiben.
    Bin gerne bereit mich in WPF und MVVM einzuarbeiten aber wenn selbst so "einfache" Sachen wie Combobox aus XML füllen und dann je nach Auswahl die anderen Werte in einer Textbox anzeigen so kompliziert werden vergeht mir irgendwie die Lust.

    Gibt es irgendwelche Bücher wo solche Beispiele wirklich 1:1 erklärt werden ohne das Ganze gleich als Diplomarbeit aufzubauen?
    Hmm - das erste Sample in 4ViewsWpf verhält sich ganz in deinem Sinne: links eine Listbox (könnteste durch eine Combo austauschen) und recht sogar mehrere Textboxen (kannst ja alle bis auf eine entfernen).
    Das ist halt ein Standard-View, der DetailView.
    Und das Wesentliche daran ist da doch auch erklärt: die Listbox.ItemsSource und die Textblöcke sind an dieselbe Property gebunden, und zusätzlich ist anne Listbox IsSynchronisizedWithCurrentItem eingestellt - mehr ist nicht zu tun.

    Ich hege übrigens auch Zweifel, ob man beinem XmlDataProvider noch von MVVM sprechen kann, denn da gibts ja garkein Viewmodel mehr. Der DataProvider wird im Xaml erstellt, und das Teil liest die Daten direkt von Platte - also wo sind da noch die Viewmodel-Klassen?
    Mag sein das es in etwa das ist was ich brauche aber ich habe keinen Plan wie ich das jetzt im Sinne der MVVM Pattern mit einer XML Datei umsetzen könnte, zumal "Galasoft MVVM Light" verwendet wird und wenn man das nicht weiss funktioniert nichtmal der Beispielcode (ist KEIN Vorwurf!!!)
    Für jemanden der sich schon etwas tiefer in die Materie von WPF und MVVM eingearbeitet hat mögen deine Tutorials sicherlich funktionieren, ich als absoluter Laie habe aber keine Ahnung was ich wie umbauen sollte.
    In Window Forms hat dies sehr einfach funktioniert auch wenn der Code wahrscheinlich nicht den höchsten Ansprüchen genügen würde.

    Moritz83 schrieb:

    wenn man das nicht weiss funktioniert nichtmal der Beispielcode (ist KEIN Vorwurf!!!)
    hä? ich habs jetzt runtergeladen und gestartet und lief.
    Das GalaSoft-Dingens ist doch dabei.

    Aber ich hab auch nochmal nachgedacht, und denke jetzt fast, dass du da vor einer der vielen Kinderkrankheiten von Wpf hängst.
    (Das wird imo bei dem ganzen Hype um Wpf unterschlagen, dass echt nur Microsoft das bringen konnte, bei jeder anneren Firma wäre das eine Totgeburt geworden.)

    Also ich denke mir, du möchtest die vom User getroffene Auswahl im Viewmodel verarbeiten können, und - potzblitz! - dassis nicht vorgesehen, jedenfalls mit dem bereitgestellten Instrumentarium nicht nach reiner MVVM-Lehre, oder wassich dafür halte.

    Ich für mein Teil habe das Problem gelöst, aber ist leider wieder eine Doktor-Arbeit geworden :P : MVVM: User-Auswahl -> Viewmodel
    Ist echt ne Doktorarbeit *g*

    Ich habe eigentlich (fürs Erste) nur vor aus einer XML Datei eine Combobox zu befüllen und dann je nach Auswahl die restlichen Werte des XML Nodes auszugeben. So in Etwa wie ein Adressbuch, der User wählt den Nachnamen aus und der Vornamen und die Adresse wird angezeigt. Unter Window Forms eine Sachen von Minuten, hier wirds für mein Empfinden extrem kompliziert (aber ich vermute ich habe einfach das Ganze noch nicht so ganz verstanden -.-)
    Das Problem ist das ich diese "Logik" für mein anderes Projekt brauche denn dort muss ich das mit 3 verschiedenen Comboboxen abwickeln können aber ich vermute ich bleibe einfach bei Window Forms, WPF ist mir persönlich einfach zu kompliziert :/
    also ich habs jetzt hingekriegt, sogar in 2 Varianten: einmal ist die Textbox direkt im Xaml über IsSynchronisized synchronisiert, und das Viewmodel kannman auch weglassen:

    XML-Quellcode

    1. <Window x:Class="Window2"
    2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    4. Title="XmlDataProviderTester" Height="350" Width="300" >
    5. <Window.Resources>
    6. <XmlDataProvider x:Key="PersonalData" Source="pack://application:,,,/XmlDataProviderTester;component/Data/Mitarbeiter.xml" XPath="Mitarbeiter/Person" />
    7. </Window.Resources>
    8. <StackPanel>
    9. <ComboBox Margin="10"
    10. DisplayMemberPath="@Nachname"
    11. ItemsSource="{Binding Source={StaticResource PersonalData}}" IsSynchronizedWithCurrentItem="True"
    12. />
    13. <TextBox Text="{Binding Source={StaticResource PersonalData}, XPath=@Vorname}" />
    14. </StackPanel>
    15. </Window>

    zum anneren ist Combo.SelectedValue an Viewmodel.Vorname gebunden, und die Textbox hängt da auch dran.

    Aber Xammeln ohne Binding-Picking ist echt 'ne Qual - bis ich mal dahinter bin, dasses XPath heißen muss statt Path :cursing:
    Nochne Doktorarbeit ist die korrekte, vollqualifizierte Angabe der Resource-Datei - gepackter Uri - eigentlich genial, aber für die Syntax gehört irgendwer erschossen: Paket-Uri
    Dateien
    Vielen vielen Dank für deine Mühe!
    Habs probiert und es funktioniert einwandfrei aber ich glaube da hätte ich wahrscheinlich jahrelang gesucht -.-

    Aber so wie ich das raushöre ist diese Lösung auch mehr Schein als Sein, oder?
    Binding-Picking wäre halt die schönste und vorallem sauberste Lösung. Werde mich morgen nochmal hinsetzen und mir deine 4Views durchlesen, für heute habe ich die Faxen dicke von WPF und Co *gg*

    Nochmals danke für deinen Einsatz!
    Xml ist halt Crap. Und der XmlDataProvider ist nochmal extra Crap.

    Daten gehören in ein typisiertes Datenmodell eingelesen, meinetwegen kann man das auch gleich als Viewmodel hernehmen, und dann kümmert sich der Xaml-Editor um syntaktische Feinheiten.

    Grade als Anfänger biste doch noch mehr auf BindingPicking angewiesen - wie sollman denn auf Anhieb das Zeug aussm Kopf und ohne Vorlagen richtig hinschreiben?
    Naja, für mich bietet sich XML an da diese Anwendung nachher lokal in der Firma auf ein paar Stationen läuft und die restlichen Mitarbeiter sie nicht brauchen. Leider habe ich keinen Zugang zum Server, sonst würde ich das auch lieber alles zentralisiert über SQL lösen aber unser Informatiker würde mich hauen wenn ich das mache.

    Hab mir auch überlegt ob ich die ganzen Daten (70 Mitarbeiterdaten (Name, Vorname, etc) und diverse Fixwerte für Berechnungen) direkt in der Anwendung einbaue ohne XML aber ich bin noch nicht sicher ob das eine gute Idee ist
    nimm unbedingt typisiertes Dataset als Datenmodell. Daten laden, speichern, verarbeiten
    Dassis jetzt zwar ein Tut für WinForms, aber das Dataset geht in Wpf genauso.
    Und daran kannman vernünftig binden.

    Ah - hier ist ein typDataset auch in einer Wpf-Anwendung verbaut: DelegateConverter
    Hmm, irgendwie habe ich da was nicht verstanden ?(
    Bei deinem Delegate Converter ists doch so das du die Data.xml in die Datatable einliest, richtig? Also bräuchte ich doch eine XML Datei, lese die dann in ein Dataset (Datatable) ein und benutze dann die Binding Variante, korrekt?


    PS: Ja ich weiss ich wollte aufhören und pennen gehen aber dat nervt mich jetzt :D
    ja, typDataset kann man als Xml-Datei persistieren. Und dann lädt das die Datei in typisierte Klassen - das ist die Besonderheit, weswegen alle anneren Arten zu persistieren vergleichsweise Crap sind.
    Beiner Xml musst du für jeden besch. Wert selbst entscheiden, welcher Datentyp das ist.
    <MyNumb>8.5</MyNumb> - ist das ein String oder ein Double? Falls ein Double, musst du KonvertierungsCode schreiben, denn defaultmäßig sind Xml-Werte immer String.
    Und der KonvertierungsCode ist tückisch, denn in englischer Kultur geparst ergibt 8,578 das tausendfache wie in deutscher Kultur, und so Scherze.
    Anners typDataset: Da legst du mw. die Spalte "MyNumb" auf Double fest, und dann hast du DataRows mit der double Property MyNumb, und mit Parsen und Konvertieren hast du null am Hut.
    Das hatte ich bereits festgestellt, natürlich ein riesen Vorteil vom Dataset. Werde mich gleich mal ransetzen sobald mein Kaffee durchgelaufen ist *g* Ohne Kaffee läuft nix ^^
    Muss mir mal deinen Converter und dein Phonebook anschauen wie du das gelöst hast
    guten morgen!

    der eigliche Converter im Converter-Tut ist für dich irrelevant. Ist halt eine Wpf-anwendung, die zeigt, dass man an typDataset mit BindingPicking binden kann.

    XML-Quellcode

    1. <DataGridTextColumn Binding="{Binding Path=ID}" Header="ID" />
    2. <DataGridTextColumn Binding="{Binding Path=Time}" Header="Time" />
    3. <DataGridTextColumn Binding="{Binding Path=Value, StringFormat={}{0:N2}}" Header="Value" >


    Und an Phonebook kannste u.a. sehen, dass Binding-Picking bereits in WinForms existierte: Nämlich im Form-Designer sind die Bindings einzurichten, dass ein funktionales Phonebook bei rauskommt.

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

    Irgendwie kapiere ich das nicht so ganz :huh:

    Du machst doch im Converter folgendes:

    1.) Private _DataFile As New FileInfo("..\..\Data.Xml") <--- einlesen der XML in _DataFile
    2.) Public Property Measures As New MeasureDts <--- neues Property
    3.) führst den Reload Command aus

    aber wo ist der Zwischenschritt XML --> Dataset?
    1. ist kein Einlesen, sondern halt ein FileInfo. Guck dir die Klasse FileInfo im ObjectBrowser an, oder gugge ObjectBrowser - da spiel ich grad damit rum
    2. jo, das Dataset nehme ich komplett als Viewmodel zum dran binden
    3. Reload Command - das ist der Zwischenschritt XML --> Dataset. Gugge den Code, wasses Reload-Command ausführt.