Einfaches Tutorial für Commands (MVVM) gesucht !

  • WPF

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von julian2704.

    Erstell dir sowas wie nen DelegateCommand oder RelayCommand wie EDR schon sagte.
    Das ist in MVVM so gängig und funktioniert zuverlässig. Damit du die volle Funktionalität bekommst musst du einfach das CanExecuteChanged Event implementieren. Tut mir echt leid ich weiß derzeit nicht wie das in VB ging.... zu lange her alles. In c# sieht das so aus:

    Quellcode

    1. event EventHandler ICommand.CanExecuteChanged
    2. {
    3. add { CommandManager.RequerySuggested += value; }
    4. remove { CommandManager.RequerySuggested -= value; }
    5. }


    Dadurch wird z.B. ein Button automatisch ein und ausgeschaltet je nach Resultat des CanExecute.
    Mein Command sieht so aus:
    Spoiler anzeigen

    Quellcode

    1. public class DelegateCommand : ICommand
    2. {
    3. private readonly Predicate<object> _canExecute;
    4. private readonly Action<object> _execute;
    5. public event EventHandler CanExecuteChanged;
    6. public DelegateCommand(Action<object> execute)
    7. : this(execute, null)
    8. {
    9. }
    10. public DelegateCommand(Action<object> execute,
    11. Predicate<object> canExecute)
    12. {
    13. _execute = execute;
    14. _canExecute = canExecute;
    15. }
    16. public virtual bool CanExecute(object parameter)
    17. {
    18. if (_canExecute == null)
    19. {
    20. return true;
    21. }
    22. return _canExecute(parameter);
    23. }
    24. public virtual void Execute(object parameter)
    25. {
    26. _execute(parameter);
    27. }
    28. public virtual void RaiseCanExecuteChanged()
    29. {
    30. if (CanExecuteChanged != null)
    31. {
    32. CanExecuteChanged(this, EventArgs.Empty);
    33. }
    34. }
    35. }

    Quellcode

    1. public class AutoDelegateCommand : DelegateCommand, ICommand
    2. {
    3. public AutoDelegateCommand(Action<object> execute)
    4. : base(execute)
    5. {
    6. }
    7. public AutoDelegateCommand(Action<object> execute, Predicate<object> canExecute)
    8. : base(execute, canExecute)
    9. {
    10. }
    11. event EventHandler ICommand.CanExecuteChanged
    12. {
    13. add { CommandManager.RequerySuggested += value; }
    14. remove { CommandManager.RequerySuggested -= value; }
    15. }
    16. }



    Nochmals sorry aber hab wirklich nicht mehr viel Ahnung von VB(sollte vll. wiederma bisschen anschauen...) aber es gibt verschiedene Converter im Internet --> nimm einfach den ersten auf google.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Vielen Dank schonmal für eure hilfreichen Antworten.
    Ich komme auch mit C#-Code relativ gut klar, von daher stellt das kein Problem da. Und im Notfall gibt's ja eh noch Converter.

    Wende die Infos dann morgen mal an :rolleyes:

    BTW: Ist der Wechsel von VB.Net auf C# eigentlich kompliziert oder eher einfach ??
    Hatte so das Grobe innerhalb von nem Nachmittag umgewöhnt. Anschließend nie wieder VB programmiert. Ich meine klar gibts Feinheiten und die kommen erst nen bisschen später aber im großen und ganzen nen paar Stunden. Einfach mal machen.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Danke, werde mich dann demnächst auch mal an C# gewöhnen ^^

    Ich habe allerdings noch eine Frage. Wie rufe ich jetzt die Commands auf ??
    Ich habe es über folgende Variante probiert:

    VB.NET-Quellcode

    1. Public ReadOnly Property SaveSettingsCommand As DelegateCommand
    2. Get
    3. Return New DelegateCommand(AddressOf SaveSettings) 'SaveSettings ist eine Sub
    4. End Get
    5. End Property

    Hierbei wird mir aber folgender Fehler geworfen:

    Quellcode

    1. Die Signatur der Protected Friend Sub SaveSettings()-Methode ist mit dem Delegaten "Delegate Sub Action(Of Object)(obj As Object)" nicht kompatibel.


    Wie kann ich diesen Fehler beheben ??
    Die Sub musst natürlich die passende Signatur haben.
    Public Sub SaveSettings(ByVal obj As Object)... so irgendwie(syntax stimmt eher nicht ganz aber so ca.)
    Außerdem solltest du nicht jedes mal einen neuen DelegateCommand machen, denn sonst wird irgendwann SaveSettings pro Click zig mal aufgerufen. Mach das eher so:

    VB.NET-Quellcode

    1. Private _saveSettingsCommand As DelegateCommand
    2. Public ReadOnly Property SaveSettingsCommand As DelegateCommand
    3. Get
    4. If _saveSettingsCommand = Nothing Then
    5. _saveSettingsCommand = New DelegateCommand(AddressOf SaveSettings)
    6. Return _saveSettingsCommand
    7. End Get
    8. End Property


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.