myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » GUI: WPF und XAML » CanExecute verändert trotz "true" nicht den Button
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

CanExecute verändert trotz "true" nicht den Button

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
behindyoû behindyoû ist männlich
myCSharp.de-Mitglied

Dabei seit: 25.06.2020
Beiträge: 12


behindyoû ist offline

CanExecute verändert trotz "true" nicht den Button

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Guten Mittag. :-)

Ich habe ein kleines Problem mit dem Button hier.
Ich nutze Prism
View

XML-Code:
                <StackPanel Orientation="Vertical" HorizontalAlignment="Left">
                    <Label Content="Username:" FontSize="15"/>
                    <TextBox Width="220" Height="25" FontSize="15" Text="{Binding Path=Username, UpdateSourceTrigger=PropertyChanged}"/>
                </StackPanel>

                <StackPanel Orientation="Vertical" HorizontalAlignment="Left">
                    <Label Content="Password:" FontSize="15"/>
                    <TextBox Width="220" Height="25" FontSize="15" Text="{Binding Path=Password, UpdateSourceTrigger=PropertyChanged}"/>
                </StackPanel>
                <Button Content="Login" Margin="5" FontSize="14" Height="28" Command="{Binding LoginCommand}"/>

ViewModel

C#-Code:
LoginCommand = new DelegateCommand(LoginAction, CanLoginExecute);

Vorerst soll der Button nur Enable sein, wenn die Werte der TextBox nicht leer sind

C#-Code:
        private bool CanLoginExecute()
        {

            return !string.IsNullOrWhiteSpace(password) && !string.IsNullOrWhiteSpace(username);

        }

Trotz richtigen Werten wird der Button nicht geupdatet und Klickbar gemacht.
Weiß einer vielleicht wo mein Fehler ist ?
Liegt es eventuell an Prism, oder gar an dem DelegateCommand, dass er das nicht triggert? ich weiß mir leider auch kein Rat mehr :/
25.06.2020 15:49 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 14.167
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Dein CanExecute ist falsch implementiert; siehe  [Artikel] MVVM und DataBinding Abschnitt Commands.

Dir fehlt die Parametrisierung sowie das Delegate dahinter.
25.06.2020 15:59 Beiträge des Benutzers | zu Buddylist hinzufügen
Th69
myCSharp.de-Poweruser/ Experte

avatar-2578.jpg


Dabei seit: 01.04.2008
Beiträge: 3.730
Entwicklungsumgebung: Visual Studio 2015/17


Th69 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

@Abt: Das paßt schon so bei Prism, s.  Commanding (es wird hier die nicht-generische Variante des DelegateCommand benutzt - sonst würde es ja auch nicht kompilieren).

Man muß RaiseCanExecuteChanged aufrufen, sobald sich der Wert (bzw. einer der Werte), die im CanExecute abgefragt werden, ändern (d.h. man muss daraus Eigenschaften machen und im Setter dann command.RaiseCanExecuteChanged() aufrufen), s.a.  WPF-Prism CanExecute method not being called.
Oder alternativ ObservesProperty() verwenden...

PS: Ich persönlich mag die Umsetzung mittels des CommandManager nicht (wie sie in dem MVVM-Artikel benutzt wird), da diese einige Nachteile hat, s. z.B.  Is the common implementation of RelayCommand violating the MVVM pattern?

Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von Th69 am 25.06.2020 16:27.

25.06.2020 16:20 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
behindyoû behindyoû ist männlich
myCSharp.de-Mitglied

Dabei seit: 25.06.2020
Beiträge: 12

Themenstarter Thema begonnen von behindyoû

behindyoû ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Th69: Oh super, vielen lieben dank. :-D
Hätte ich auch kommen können, in dem ich die PrismyLibray mal unter Commands etwas durchforstet hätte :-( Tut mir leid, für den unnötigen Beitrag.

Hättest du irgendein Anreiz es anders handzuhaben ?

Abt: Vielen dank für die schnelle Antwort.
Ich werde mir den Beitrag trotz der Lösung mal anschauen, kann ja nicht schaden auch für den fall, sollte ich Projekte ohne Prism bearbeiten.

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von behindyoû am 25.06.2020 16:47.

25.06.2020 16:45 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Th69
myCSharp.de-Poweruser/ Experte

avatar-2578.jpg


Dabei seit: 01.04.2008
Beiträge: 3.730
Entwicklungsumgebung: Visual Studio 2015/17


Th69 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von behindyoû:
Hättest du irgendein Anreiz es anders handzuhaben ?

Beziehst du dich auf mein "PS"? Damit wolle ich nur ausdrücken, daß ich die Prism-Variante mittels DelegateCommand (welche man aber auch in Nicht-Prism Projekte einsetzen kann) besser als die RelayCommand-Variante finde. Der Artikel selbst ist aber sehr zu empfehlen und ich weise auch hier im Forum öfters darauf hin. ;-)

Läuft es denn jetzt bei dir?

Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Th69 am 25.06.2020 17:34.

25.06.2020 17:33 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
behindyoû behindyoû ist männlich
myCSharp.de-Mitglied

Dabei seit: 25.06.2020
Beiträge: 12

Themenstarter Thema begonnen von behindyoû

behindyoû ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Th69: Ja, es hat wunderbar funktioniert. :D
Aktuell versuche ich einige Beispiele über die Verbindung zu einer SQLite Datenbank mit dem MVVM-Muster zu finden, irgendwie etwas schwierig nachzuvollziehen, da ich mit den Fachbegriffen nicht so vertraut bin, was genau die in den Artikeln mit dem BusinessLogic meinen, wo genau ich meine Verbindung zur DB aufbaue, wo in dem Architektur ich die Abfragen mache aber versuche mich da irgendwie durch zu kämpfen. :D
25.06.2020 22:40 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
MrSparkle MrSparkle ist männlich
myCSharp.de-Team

avatar-2159.gif


Dabei seit: 16.05.2006
Beiträge: 5.450
Herkunft: Leipzig


MrSparkle ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von Th69:
Man muß RaiseCanExecuteChanged aufrufen, sobald sich der Wert (bzw. einer der Werte), die im CanExecute abgefragt werden, ändern (d.h. man muss daraus Eigenschaften machen und im Setter dann command.RaiseCanExecuteChanged() aufrufen)

Nein, muß man nicht, so ist das nicht gedacht. Stattdessen sollte man den CommandParameter mittels DataBinding festlegen. Dann wird der Status neu überprüft, sobald sich der gebundene Wert ändert. Falls der Status von mehreren Werten abhängig ist, kann man auch (Multi)Trigger verwenden. In allen anderen Fällen kann man den Button auch unabhängig vom Command aktivieren oder deaktivieren.
30.06.2020 10:22 Beiträge des Benutzers | zu Buddylist hinzufügen
Th69
myCSharp.de-Poweruser/ Experte

avatar-2578.jpg


Dabei seit: 01.04.2008
Beiträge: 3.730
Entwicklungsumgebung: Visual Studio 2015/17


Th69 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Du meinst schon Prism, oder? Weil in der offiziellen, von mir verlinkten, Doku steht (außer ObservesProperty() bzw. ObservesCanExecute()) keine weitere Alternative.
30.06.2020 12:29 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 2 Monate.
Der letzte Beitrag ist älter als 2 Monate.
Antwort erstellen


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 20.09.2020 12:14