Binding scheint nicht (richtig) zu greifen

  • WPF

Es gibt 35 Antworten in diesem Thema. Der letzte Beitrag () ist von MichaHo.

    MichaHo schrieb:

    und innerhalb der Main und ChildSteps noch Steps hoch oder runter verschieben kann, mit gleichzeitiger Anpassung der StepNumber....

    Wenn die komfortabel gemacht werden soll muss allerdings für MainSteps und ChildSteps jeweil ein eigener Workspace her. Wo sollen denn sonst die Commands für das runter und rausschieben sein.
    Ausserdem empfehle ich dir hier dann auch wieder die CollectionView da hier Sorting implementiert ist (wie Filter)
    Aber ob das nicht zu früh für dich ist im Moment? Aber versuchs ruig.

    MichaHo schrieb:

    Also passiert doch so einiges im CodeBehind... Da kann ich mir dann viel aus meinem WinForms Projekt raus holen...

    Ja, ich habe im Originalbeispiel darauf geachtet das ich es einfach halte, weshalb hier noch ein paar Dinge über CodeBehind gemacht werden, so kann man von WinForms kommend noch einige nachvollziehen.

    MichaHo schrieb:

    So langsam kommt aber Licht ins Dunkle

    Das freut mich, nur mut. Wirst sehen, irgendwann macht es klick und dann ist plötzlich alles logisch. Auch wenn es jetzt nocht nicht vorstellbar ist.

    MichaHo schrieb:

    Der Code aus dem Code Behind kommt bei MVVM vermutlich in die ViewModel Klassen, richtig?

    Richtig, da gibt es aber auch in den Klassen keinen Verweis auf Control, Windows, Messagebox, usw.

    MichaHo schrieb:

    Achja, eine Sache noch:
    XML-Quellcode

    <ucl:ucMainChildSteps DataContext="{Binding}"/>

    dies hier im OsiComplete Window. Was bedeutet es wenn hinter dem Binding nichts angegeben ist?

    Das ist im grunde das selbe als wenn ich NIX angeben würde. Durch die vererbung erbt das Usercontrol den DateContext des übergeordneten Elements. Ich gebe es nur gerne so an damit ich einfach weis auf was gebunden ist. Ist einfach so ne eigenart von mir.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Ah, OK, klingt logisch....
    Ja, das mit dem Verschieben wird echt tricky... habs in Winforms auch nicht anständig hin bekommen weil verschieben innerhalb eines gebundenen Controls echt mühselig ist...
    Aber eins ist mir doch noch aufgefallen:

    C#-Quellcode

    1. private ICommand _removeInstructionCommand;
    2. public ICommand RemoveInstructionCommand
    3. {
    4. get { return _removeInstructionCommand ?? new RelayCommand(RemoveInstructionCommand_Execute, RemoveInstructionCommand_CanExecute); }
    5. set { _removeInstructionCommand = value; RaisePropertyChanged(); }
    6. }
    7. private bool RemoveInstructionCommand_CanExecute(object obj)
    8. {
    9. return MainWs != null && MainWs.IsInEditMode && AvailableInstructionView.CurrentItem != null;
    10. }
    11. private void RemoveInstructionCommand_Execute(object obj)
    12. {
    13. Instruction instruction = (Instruction)AvailableInstructionView.CurrentItem;
    14. if (MessageBox.Show("Are you sure to delete this Item?", "Delete", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)
    15. AvailableInstructions.Remove(instruction);
    16. }

    Das ist der Command zum Löschen einer Instruction, nur scheint es nicht zu fruchten.
    Wenn der Command ausgeführt wird, ist die Instruction weg. Dann kann ich speichern usw. aber sobald ich wieder ReloadData ausführe ist die Instruction wieder da...

    EDIT: hab den RemoveCommand nun auch isn ShowInstructionWindow mit rein gepackt, macht dort auch mehr Sinn und funktioniert 1a

    C#-Quellcode

    1. private ICommand _removeInstructionCommand;
    2. public ICommand RemoveInstructionCommand
    3. {
    4. get { return _removeInstructionCommand ?? new RelayCommand(RemoveInstructionCommand_Execute, RemoveInstructionCommand_CanExecute); }
    5. set { _removeInstructionCommand = value; RaisePropertyChanged(); }
    6. }
    7. private bool RemoveInstructionCommand_CanExecute(object obj)
    8. {
    9. return true;
    10. }
    11. private void RemoveInstructionCommand_Execute(object obj)
    12. {
    13. if (MessageBox.Show("Are you sure to delete this Item?", "Delete", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)
    14. InstructionList.Remove(SelectedInstruction);
    15. }

    "Hier könnte Ihre Werbung stehen..."

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „MichaHo“ ()

    Hallo

    Naja, sowas mit der Riehenfolge habe ich schon mal eine Demo gemacht.
    Abarbeitungs-Reihenfolge mittels Combobox festlegen.
    War im grunde überhaupt kein problem, ist unter WPF mit Binding sogar einfach.

    Wegen deinem aktuellen speicherproblem.... du speicherst ja auch nicht. =O

    C#-Quellcode

    1. InstructionList.Remove(SelectedInstruction);

    OK, aber da Fehlt ja noch _ctx.SaveChanges() oder?

    Sonst hast du eben nach dem neu laden wieder alle Einträge, weil das file wir ja neu geladen ohne das du es vorher (mit einem eintrag weniger) speicherst.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Hi,
    dadurch, das ich es ausgelagert habe ins ShowInstructionWindow und dieses Windows ja entweder mit Save oder Cancel geschloßen werden muss, wird dann auch gespeichert.
    Klappt bestens.

    Das mit dem Verschieben ist in etwa so gemeint.
    Du hast die Arbeitsanweisung (Instruction), die hat ja ihre Hauptschritte und Unterschritte.
    Jetzt fällt einem Produktionsmitarbeiter auf, das zwischen Unterschrit 5 und 6 eigentlich ein Schritt dazwischen muss.
    Also muss das Qualitätsmanagement (die schreiben bei uns die Arbeitsanweisungen) dort einen Schritt einfügen.
    Damit sie nun nicht händisch alle nachfolgenden Schritte um eins erhöhen müssen, sollte das Programm dies tun.
    Also zum Beispiel einen Step markieren und dann vorher oder nacher Einfügen auswählen und alle StepNumber werden dann enstprechend erhöht.
    Zwischen 5 und 6 einen einfügen = 6 ist dann 7 usw. und der neu eingefügte ist Step6...

    Zusätzlich wollen die, das wenn einer feststellt das Step10 eigentlich Step7 ist, das man dann diesen Step an Position 7 zieht, los lässte und die Stepnummern passen sich automatisch an...
    Wobei man dies auch so lösen könnte, das der Step 10 dann halt editiert werden muss und aus 10 macht man 7 und die alte 7 ist dann 8 usw.
    Ist schwer zu erklären :(
    "Hier könnte Ihre Werbung stehen..."
    Aber genau das ist in dem verlinkten Beispiel enthalten!! Da gings sogar auch um Produktion.

    Schau dir das Beispiel an. Das hat sogar fpr jeden Teil eine eigene Klasse. Dies kpmmert sich um alles. Das mit der sortierung ist kein Problem, das würde sogar mittels Drag&Drop funktionieren.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    OkiDoki

    Ansonsten, vieleicht kann ich ja morgen beim LiveWebcast mehr Licht ins Dunkel bringen.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Genau, freu ich mich schon drauf. Vielleicht kannste dann auch nochmal zeigen, wie man die ganzen ContextMenus und die ganzen Controls nur dann editierbar macht, wenn der Editier Knopp gedrückt wurde.
    Finde es im WpfNotes nämlich nimmer :(
    "Hier könnte Ihre Werbung stehen..."
    Stichwort: Command_CanExecute!
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    @Nofear23m Habs gerade gefunden..... Allerdings in den Styles :)

    XML-Quellcode

    1. <Style x:Key="AutoDisableListBoxStyle" TargetType="{x:Type ListBox}" BasedOn="{StaticResource {x:Type ListBox}}">
    2. <Setter Property="IsEnabled" Value="{Binding MainWs.IsInEditMode}"/>
    3. </Style>
    4. <Style x:Key="AutoDisableContextMenuStyle" TargetType="{x:Type ContextMenu}" BasedOn="{StaticResource {x:Type ContextMenu}}">
    5. <Setter Property="IsEnabled" Value="{Binding MainWs.IsInEditMode}"/>
    6. </Style>


    Gut, im CanExecute wird gesteuert ob wir gerade im EditMode sind oder nicht.... aber das hab ich bei allen Commands ja immer vom vorherigen übernommen, also sollte das passen...
    "Hier könnte Ihre Werbung stehen..."
    Oh, entschuldige. OK, dann hab ichs doch über XAML gemacht. Man sieht hier wieder, viele Wege führen nach Rom.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Vor allem ist das Mega cool, das über die Styles zu machen... einmal angelegt und flupp...läuft
    Falls Du fürs Video morgen was größeres brauchst, sag Bescheid, dann schick ich Dir nochmal mein Projekt :)

    P.S. nicht ums fertig zu programmieren, das mag ich schon selbst wurschteln...
    "Hier könnte Ihre Werbung stehen..."

    MichaHo schrieb:

    Vor allem ist das Mega cool, das über die Styles zu machen... einmal angelegt und flupp...läuft

    Ja, solange die Datenbindung korrekt ist und sich nicht ändert!! aber du hast schon recht. Das ist eines der Vorteile der WPF. Hier musst du dich nichtm ehr selbst darum kümmern. Das Binding und der Style übernehmen das für dich. Oh, da kommt wer auf den Geschmack was?!?!?!

    MichaHo schrieb:

    Falls Du fürs Video morgen was größeres brauchst, sag Bescheid, dann schick ich Dir nochmal mein Projekt

    Naja, es soll ja um das WPFNotes Beispiel gehen, aber gut das du es sagst, ich werde auf die ContextMenüs auch eingehen, die sind nämlich sowieso etwas Tricky.

    Ich weis ja nicht wann du dein Projekt fertig haben willst und ob du derweilen mit einer nicht so guten Version auskommst und dann eine V2 quasi machen würdest, aber ich sage dir jetzt schon, mit MVVM geht das ganze noch besser. Anfangs scheint MVVM unübersichtlich zu sein und vieleicht etwas unständlich. Mit jedem Viw welches man mehr im Projekt hat kommt man aber zu dem entschluss das es sich mehr als lohnt.

    Ich habe die letzen Monate jemandem MVVM beigebracht, weil es meinte es müsste ein etwas umfangreicheres Projekt mit viel Lokig machen und weis nicht wie es da am besten anfangen soll.
    Es musste sich 2 Monate mal in MVVM einarbeiten und hat geflucht. erst letzte Woche meinte er: Wenn mans mal raus hat ist es super Übersichtlich und einfach zu Warten und zu erweitern. Endlich schluss mit Spagetticode.

    Insofern kann ich nur sagen, es lohnt sich auf mein Tutorial zu warten, ich weis ich bin da etwas langsam aber nur nebenbei ist es eher schwierig. aber Ihr müsst nicht nur mit mir, sondern vorallem (!!!) mit euch selbst Geduld haben.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Geschmack hab ich jede Menge :)
    Du hattest in deinem Video (Converter) diese CommandParameter angesprochen.

    XML-Quellcode

    1. <Button Margin="3" Padding="3" Command="{Binding AddEditMainStepCommand}" CommandParameter="Add" Background="Transparent" >

    Wie fange ich jetzt diesen Parameter im AddEditMainStepCommand ab?
    In der Window Klasse hab ich eine Property IsAdd und im Command:

    C#-Quellcode

    1. private void AddEditMainStepCommand_Execute(object obj)
    2. {
    3. AddEditMainStepWindow mStep = new AddEditMainStepWindow();
    4. MainWs.Ctx.SaveChanges();
    5. if (obj.ToString() == "Add")
    6. mStep.IsAdd = true;
    7. else
    8. mStep.IsAdd = false;
    9. mStep.ShowDialog();
    10. if (RefreshDataCommand.CanExecute(null)) RefreshDataCommand.Execute(null);
    11. }


    Das klappt so wie ich es gemacht hab nicht, aber wie komme ich an den Parameter dran?
    "Hier könnte Ihre Werbung stehen..."
    Definiere bitte "Klappt nicht".

    Bekommst den Parameter nicht in die Klasse oder was klappt nicht?

    PS: Verwechsle aber Parameter in Converters nicht mit Parameter in Commands. In Commands sind Parameter Bindbar da DependecyPropertys.
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Oh ich glaub da muss ich weiter ausholen.

    Also, im View habe ich 2 Button den gleichen Command aufrufen AddEditMainStepCommand (damit ich das alles nur einmal schreiben muss)
    anhand des CommandParameter wollte ich unterscheiden ob ich einen Step berabeiten oder neu anlegen will.
    Dazu habe ich in der Klasse des AddEditMainStepWindow eine public Property IsAdd angelegt, die ich ja vom Command aus setzen müsste.

    Ähhh grad nochmal über die Haltepunkte geguckt. Der Parameter ist tatsächlich genauso abfragbar und im Parameter steht auch Add drinn.
    Dann klemmt es in der Window Klasse...

    C#-Quellcode

    1. private Context.OsiContext _ctx;
    2. public bool IsAdd { get; set; }
    3. public AddEditMainStepWindow()
    4. {
    5. InitializeComponent();
    6. if (!(DesignerProperties.GetIsInDesignMode(this)))
    7. {
    8. _ctx = new Context.OsiContext();
    9. AvailableInstructions = _ctx.Instructions;
    10. if(IsAdd)
    11. {
    12. CurrentMainStep = new Model.MainStep() { InstructionID = AvailableInstructions[0].ID, StepNo = 0, StepText = "Unnamed" };
    13. }
    14. else
    15. {
    16. MainStepList = AvailableInstructions[0].MainSteps;
    17. SelectedMainStep = MainStepList.FirstOrDefault();
    18. }
    19. DataContext = this;
    20. }
    21. }


    EDIT: Vergiss alles was ich gesagt hab.... es liegt wieder am Binding.... das steckte noch auf dem Model anstatt auf dem Code Behind
    "Hier könnte Ihre Werbung stehen..."