Laden...

WPF-MVVM: Methode an eine Textbox binden

Erstellt von wickedcsharper vor 8 Jahren Letzter Beitrag vor 8 Jahren 2.588 Views
wickedcsharper Themenstarter:in
160 Beiträge seit 2008
vor 8 Jahren
WPF-MVVM: Methode an eine Textbox binden

Hallo zusammen,

bin relativ neu in WPF. Das Umdenken von WinForms zu WPF fällt mir relativ schwer.
Die ganze WPF Geschichte wirkt schwerfällig und sperrig- aber egal...Arbeitgeber will WPF...ich muss es umsetzen. Folgende Situation: Ich habe eine Klasse Person mit der Methode getName und will das Ergebnis der Methode (den Vor- und Zunamen) an eine Textbox binden. Suche jetzt seit einer Stunde im Netz und finde nix was mit VS2012 funktioniert. Kann doch nicht wahr sein


namespace CustomNamespacesInXAML
{
    public class Person
    {
        public string Nachname { get; set; }
        public string Vorname { get; set; }


        public Person()
        {
            //Nachname = "Schmitz";
            //Vorname = "Torsten";
        }

        public string getName()
        {
            return this.Vorname + " " + this.Nachname;
        }
    }
}

und in xaml:


    <Window.Resources>
        <local:Person x:Key="Person" Vorname="Torsten" Nachname="Schmitz" />
        <ObjectDataProvider x:Key=[B]"Pers"[/B]
       ObjectType="{x:Type local:Person}"
       MethodName="getName"/>
    </Window.Resources>

    <TextBox Text="{Binding [B]Pers[/B]}" HorizontalAlignment="Left" Height="50" Margin="59,78,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="200"/>


ER malt die Textbox schreibt aber nix rein.

Wie bindet man denn nun die Methode einer Klasse an eine Textbox? Wäre für Hilfe dankbar.

„Wenn man eine Katze auseinandernehmen will, um zu sehen, wie sie funktioniert, hat man als erstes eine nicht funktionierende Katze in den Händen.“

6.911 Beiträge seit 2009
vor 8 Jahren

Hallo wickedcsharper,

mach doch eine Eigenschaft Name (od. ähnlich, Fullname, etc) und binde diese an die TextBox.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

2.207 Beiträge seit 2011
vor 8 Jahren

Biete die Person auf einer Klasse (Dein ViewModel) als Property an.

Dann setzt du den DataContext des Xamls auf dein ViewModel.

Dann kannst du dein Binding machen.

Das sagt aber auch jedes MVVM/WPF-Tutorial 😃

PS: Das GetName kannst du in ein Property machen, auf das du dann wieder binden kannst.

wickedcsharper Themenstarter:in
160 Beiträge seit 2008
vor 8 Jahren

Danke für die Vorschläge...
MVVM wollte ich für diese Beispiel nicht gleich implementieren, wenngleich das natürlich für ein Projekt ratsam ist.

Das ganze über eine Propertie zu machen kam mir zwar auch schon in den Sinn, aber das beantwortet ja nicht die Frage, wie man Funktionsrückgaben an ein Controll bindet.
Gibts dafür keine "BestPraxis". Das mit dem Propertie scheint mir so ein WorkArround

Gruß

„Wenn man eine Katze auseinandernehmen will, um zu sehen, wie sie funktioniert, hat man als erstes eine nicht funktionierende Katze in den Händen.“

2.207 Beiträge seit 2011
vor 8 Jahren

Lies dir mal ein MVVM-Tutorial durch. Das ist nunmal der Weg, wie MVVM im WPF läuft. ViewModel als DataContext und auf Properties bietet man an, was man anbieten möchte.

F
10.010 Beiträge seit 2004
vor 8 Jahren

@wickedcsharper:

Das mit dem Propertie scheint mir so ein WorkArround

Dann hast du es komplett falsch verstanden.

Tu dir selber einen gefallen und hör auf in WindowsForms zu denken denn so wie du es hier versuchst ist es natürlich schwerer.

Ich persönlich möchte nie mehr auf WindowsForms zurück.

4.931 Beiträge seit 2008
vor 8 Jahren

Hallo wickedcsharper,

lies dir mal Gewusst wie: Binden an eine Methode durch. Mit dem ObjectDataProvider bist du schon auf dem richtigen Weg - du mußt jetzt nur noch das Binding bei der Textbox korrekt durchführen (siehe dir dazu das Beispiel an).
Probiere also mal:


<TextBox.Text>
    <Binding Source="{StaticResource Pers}"
             BindsDirectlyToSource="true" UpdateSourceTrigger="PropertyChanged" />
</TextBox.Text>

Auch das Binden an eine Methode widerspricht nicht dem MVVM (gerade wenn man noch Parameter berücksichtigen muß).
Im obigen Beispiel ist sicherlich eine VM-Eigenschaft einfacher, aber zum Lernen und Verstehen ist es gut, wenn man auch diesen Weg beherrscht.

wickedcsharper Themenstarter:in
160 Beiträge seit 2008
vor 8 Jahren

@Th69
ich versuchs mit dem DataProvider und dem richtigen Binding an die TextBox. ich denke hier liegt das Problem.

@Fzelle: Die Antwort ist Quatsch mit Soße -

„Wenn man eine Katze auseinandernehmen will, um zu sehen, wie sie funktioniert, hat man als erstes eine nicht funktionierende Katze in den Händen.“

2.207 Beiträge seit 2011
vor 8 Jahren

@Fzelle: Die Antwort ist Quatsch mit Soße -

Nein ist sie nicht. So wie du es probierst läuft MVVM nunmal nicht. Ist klar, dass MVVM dann mühsam erscheint.

189 Beiträge seit 2014
vor 8 Jahren

@Fzelle: Die Antwort ist Quatsch mit Soße -

Auch wenn ich verstehen kann, dass die Antwort von FZelle nicht deine Frage direkt trifft, so ist aber deine Reaktion unangemessen.
FZelle hat recht, wenn er dir sagen will, dass die Denkweise für WinForms und WPF/MVVM komplett unterschiedlich sind.
Erfahrungen in WinForms sind oft sogar hinderlich, wenn man sich in WPF/MVVM reindenken muss.
Und ob man nun WinForms oder WPF bevorzugt ist neben Anforderung des Chefs oder der Kunden und dem Wissen dass WinForms immer mehr als veraltet gilt einfach auch Geschmackssache.
Über letzteres zu Diskutieren führt am Ziel vorbei.

-Edit: Eindeutigkeit des ersten Satzes angepasst.