[Brett vorm Kopp Teil VI (o.s)] Standard MVVM mit DelegateCommand
-
Jupp! Alle 2-3 Jahre wieder.
Ich habe seit 2001 nicht mitgezählt aber ich glaube Teil VI ist richtig.
Also ich habe ein klassisches MVVM.
Der hoffentlich entscheidene Teil vom ModelView sieht so aus:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ComponentModel; public class ModelView_GUI_data : INotifyPropertyChanged { public ModelView_GUI_data(GUI_data gui_data) { ... this.saveCommand = new DelegateCommand(SaveCommand_Execute, SaveCommand_CanExecute); } private DelegateCommand saveCommand; public DelegateCommand SaveCommand // hier gibbet Aua! { get { return saveCommand; } } private bool SaveCommand_CanExecute(object argument) { // Valdierung blabla } private void SaveCommand_Execute (object argument) { // serialize bla laa }
Dazu habe ich ein Standard DelegateCommand das ich mal komplett darstelle:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Input; namespace XXX { class DelegateCommand: ICommand { public DelegateCommand(Action<object> execute, Func<object, bool> canExecute) { this.execute = execute; this.canExecute = canExecute; } private Action<object> execute; private Func<object, bool> canExecute; public event EventHandler CanExecuteChanged; public void Execute(object parameter) { this.execute(parameter); } public bool CanExecute(object parameter) { if (parameter == null) return true; return CanExecute(parameter); } public void RaiseCanExecuteChanded() { if (CanExecuteChanged != null) CanExectueChanged(this, EventArgs.Empty); } } }
wird im View wie folgt aufgerufen:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Shapes; public partial class FeatureDefinition : Window { public FeatureDefinition(GUI_data gui_data) { InitializeComponent(); this.DataContext = new ModelView_GUI_data(gui_data); } }
im XAML wird es so aufgerufen:
Command="{Binding Path=SaveCommand}"/>
obwohl unwichtig.
Und er meldet mir an der oben markierten Stelle:
Inkonsistenter Zugriff: Eigenschaftentyp "XXX.DelegateCommand" ist weniger zugreifbar als Eigenschaft "XXX.ModelView_GUI_data.SaveCommand"
noch .Net 4.0!
Könnte mir mal jemand einen Klapps im Nacken geben und El Blindo mal zeigen, was er nicht sieht oder versteht woher die Inconsisten herührt? Vor allem was anders ist zu den andern 10 MVVMs, die ich bereits entwickelt habe? Ich sitze schon Stunden daran.
P.S.
An meine "Feinde". _Jetzt_ könnt Ihr zeigen, dass ich keine Ahnung habe.
-
DelegateCommand ist internal und SaveCommand ist public? Sagt eigentlich die Fehlermeldung schon. Überleg dir, was jemand außerhalb der Assembly mit dem Wert dieser Property anfangen sollte.
-
Bashar schrieb:
DevlegateCommand ist internal und SaveCommand ist public? Sagt eigentlich die Fehlermeldung schon. Überleg dir, was jemand außerhalb der Assembly mit dem Wert dieser Property anfangen sollte.
Ja, unterschiedliche Sichtbarkeitsbereiche war auch meine erste Überlegung, aber ich komme zum Verrecken nicht dahinter, warum das mit den andern MVVMs funktioniert hat. - Ob ich hier vielleicht mit 4.0 und 4.5 Namesräume was durcheinander haue. DelegateCommand habe mal abgeändert, um nicht zufällig auf interne ObjeKte zu stossen.
ICommand liefert internal Objekte bei der 4.0, aber bei 4.5 nicht?!?
Ich verstehe hier immer noch nichts.
-
public class DelegateCommand : Command
-
ups!
*10 min in Ecke schämen*Danke!