Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
CanExecute verändert trotz "true" nicht den Button
behindyoû
myCSharp.de - Member



Dabei seit:
Beiträge: 20

Themenstarter:

CanExecute verändert trotz "true" nicht den Button

beantworten | zitieren | melden

Guten Mittag. :-)

Ich habe ein kleines Problem mit dem Button hier.
Ich nutze Prism
View
                <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


LoginCommand = new DelegateCommand(LoginAction, CanLoginExecute);

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

        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 :/
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15807
Herkunft: BW

beantworten | zitieren | melden

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

Dir fehlt die Parametrisierung sowie das Delegate dahinter.
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4026

beantworten | zitieren | melden

@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 .
private Nachricht | Beiträge des Benutzers
behindyoû
myCSharp.de - Member



Dabei seit:
Beiträge: 20

Themenstarter:

beantworten | zitieren | melden

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 .
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4026

beantworten | zitieren | melden

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 .
private Nachricht | Beiträge des Benutzers
behindyoû
myCSharp.de - Member



Dabei seit:
Beiträge: 20

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
MrSparkle
myCSharp.de - Team

Avatar #avatar-2159.gif


Dabei seit:
Beiträge: 5966
Herkunft: Leipzig

beantworten | zitieren | melden

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.
Weeks of programming can save you hours of planning
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4026

beantworten | zitieren | melden

Du meinst schon Prism, oder? Weil in der offiziellen, von mir verlinkten, Doku steht (außer ObservesProperty() bzw. ObservesCanExecute()) keine weitere Alternative.
private Nachricht | Beiträge des Benutzers