ViewModel zu dazugehöriger View festlegen

  • WPF

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von Nofear23m.

    ViewModel zu dazugehöriger View festlegen

    Hallo allerseits,

    bin gerade dabei mein Projekt auf MVVM umzustellen. Wie auch immer, damit ich überhaupt was sehe, muss ich auf die klassischen aus der Winforms bekannten Events benutzen erstmal.

    Jetzt habe ich ein UserControl "NavigationsleisteView" erstellt in der View.
    Im ViewModel eine dazugehörige Klasse angelegt (NavigationsleisteViewModel)
    Den Datenkontext entsprechend festgelegt.

    Wenn ich nun ein MoueLeftButtonDown-Property festlege, klicke ich auf "Neuen Ereignishandler erstellen"

    Problem ist, dass die IDE mir dann eine Navigationsleiste.xaml.vb erstellt und die Ereignisprozedur da reinschreibt, anstatt in meine NavigationsleisteViewModel...

    Wie kann ich das ändern? Zuerst einmal kompilieren? Ich hab die View mit Copy und Paste befüllt und will jetzt nicht alle MouseLeftButtonsDown erst rauslöschen, zu kompilieren und dann wieder reinschreiben...

    So far...

    Edit: Komplieren bringt auch nichts, hab ich grade versucht...

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

    was willst du mit der MouseLeftButton-Property?
    Üblicherweise hat man Buttons oder MenuItems, und die haben eine Command-Property, die man an eine Viewmodel-Property binden kann, vorzugsweise vom Typ DelegateCommand (oder auch RelayCommand).
    Guck einfach mal das eine oder andere wpf-tut von mir durch, wie bei mir das Viewmodel angebunden und dazu gebracht wird, zu tun, was es soll.
    Ja bei mir wird das so aussehen, also wenns mal fertig ist:

    XML-Quellcode

    1. <Border Name="brdZurPlaylistZufügen" Style="{DynamicResource Navigationsbuttons}" ToolTip="Füge ausgewählte Musiktitel der Playlist zu...">
    2. <Border.InputBindings>
    3. <MouseBinding MouseAction="LeftClick"
    4. Command="{Binding Testkommando}"/>
    5. </Border.InputBindings>
    6. <Canvas Name="icoZurPlaylistZufügen" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" Width="32" Height="32" VerticalAlignment="Center" HorizontalAlignment="Center">
    7. <Path Fill="{DynamicResource VordergrundfarbeBrush}" Data="..."/>
    8. </Canvas>
    9. </Border>


    Habs getestet und es funktioniert. Aber lohnt das, das jetzt bei jedem "Button" so zu machen. Ich brauche nur den Klick, kein CanExecute und in diesem speziellen Fall auch keine CommandParameter...
    Ne also ich meinte jetzt eher unter dem Gesichtspunkt "normales Event" oder Relay Command... Hab da auf der linken Seite so eine Art Navigationsleiste, und da ich gelesen hab "darf" man da auch normale Events machen wenn das nur die View betrifft... Also zB Private Sub brdZurPlaylistZufügen_Click

    Oder versteh ich dich falsch?

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

    Ja genau da geb ich dir vollkommen Recht. In diesem Fall - zur Playlist zufügen - total.

    Ich hab jetzt aber auch vier "Buttons", die lediglich dazu da sind, die "Registerkarten" des Programms zu wechseln. Da klickt man einfach nur drauf, und die entsprechende Registerkarte wird sichtbar gemacht, alle anderen unsichtbar.

    Ich hatte ja vor das auch mit Binding zu lösen, aber so ein Border hat nun mal keine IsSelected-Eigenschaft. Wär cool wenn man dann die wie Radio Buttons auch gruppieren könnte... Siehst du eine Möglichkeit, das hinzubekommen, aber trotzdem bei den Borders zu bleiben weil die Lösung find ich ziemlich gut...

    Ansonsten muss ich das halt mit nem MouseLeftButtonDown machen. Ich dachte eigentlich das Binden von View ans ViewModel wäre mit dem Festlegen des Datacontext gelöst...
    Hallo

    Erstmal muss der Border das nicht haben. Der Border kann genauso innerhalb eine Header eines TabItems sein, ein TabControl muss in der WPF ja nicht so aussehen wie es das üblicherweise tut. Deine Fantasie ist gefragt.
    Dann kannste z.b. mit einem "SelectedPage" mit Binding arbeiten.

    Betrifft etwas nur - und wirklich NUR die View kann das gerne in die CodeBehind. Aber nicht in das ViewModel. Dort würds auch nicht klappen, die Layer sind getrennt.
    Dafür gibt es eben die CodeBehind, da kannste Controls manipulieren, auch Erfahrung würde ich aber sagen das dies wirklich so gut wie nie der Fall ist.

    Schildere einfach (evtl. mit Screenshots) was du vor hast und warum das mit dem Border und wir können dich sicher beraten was ein evtl. Binding angeht. Und so lernt man Binding auch, nicht indem man versucht mit aller gewalt dem aus dem Weg zu gehen nur weil man glaubt es geht ja sowieso nicht. Wo ein Wille ist, ist auch ein Weg ;)

    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. ##

    Für mich sind 4 Buttons, die 4 Registerkarten durchschalten nichts anderes als das Anwählen eines SelectedItem in einer CollectionView, die RegisterkartenViewmodelse enthält.
    IsSelected braucht man nicht, wenn es immer nur ein SelectedItem geben soll. CollectionView hält die Property CurrentItem dafür bereit.
    Also ein typischer DetailView. Hab ich nicht iwo auch ein Tut "Vier Views in Wpf"?
    VielModel sind ja genauso nur Objekte.
    Wie jede andere Klasse.
    Und wenn du in eine Auflistung eine Liste von ViewModels packst bist du super flexibel und dynamisch unterwegs.

    Hab ich übrigens auch ein Kapitel wie das dann mittels DataTemplates geht. Musste nur mal durchgehen.

    Grüße
    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. ##