ich komm leider bei meinem Programm nicht weiter.
Ich möchte drei Buttons in Abhängigkeit von zwei Variablen in meinem ViewModel auf IsEnabled = True setzen bzw false.
Dazu habe ich mit den MultiDataTriggern versucht auf die Variablen zu binden. Aber leider klappt das nicht so wie ich mir das vorstelle.
Habt ihr noch eine Idee?
Ich sehe so auf Anhieb keinen groben Fehler, außer dass ich so gar kein Fan vom (Service) Locator Pattern bin ^^
Sind die gezeigten Properties im MainVM, oder woanders?
Und schau mal in VisualStudio (ich nutze 2022), das hat ein "XAML Binding Failures"-Fenster. Alternativ sollten Binding-Fehler im Output landen.
Wenn das Binding scheitert, dann sollte das dort auftauchen.
Danke dir, das war schon der Hinweis, der mir gefehlt hat. Die Variablen liegen in einer anderen VM.
Ich vermute, es gibt keine Möglichkeit, für die Commands einen anderen DataContext zu setzen, als für meine Variablen, oder?
Du kannst jeden DataContext setzen, den Du setzen willst, aber irgendwie musst Du den ja auch finden.
Der einfachste Weg ist, dass ein MainViewModel Referenzen zu den einzelnen Dialogen/Bestandteilen hat und die haben Referenzen zu den Details, die sie benötigen.
Im Style arbeitest Du jedenfalls immer gegen den DataContext, den auch das Ziel-Objekt (der Button) hat.
Wenn Du da einen anderen DataContext brauchst, dann setze am Button selber einen anderen oder keinen DataContext.
Oder Du setzt ein Binding, in dem Du mit Hilfe einer RelativeSource ein anderes Control (im VisualTree hoch suchen, z.B. das StackPanel) suchst und dann direkt an den DataContext davon bindest.
Normalerweise ist das nicht notwendig, das macht man nur, wenn man aus irgendeinem Grund einen anderen DataContext hat, das aber nicht ändern kann.
Das war aber jetzt genau das, was ich gebraucht habe
Mein DataContext für den Button hab ihc ja auf MainVM gelegt, da dort die UpdateViewcommand liegt.
Aber die Variable für meine Prüfung liegt in einer anderen VM.
Vielen Dank dir. Jetzt läuft es so, wie ich mir das vorstelle...
1. Warum 1 Command mit verschiedenen Parametern?
Das sind meist Einzeiler und lassen sich durch 2. besser managen. Kannst ja das UpdateView() weiterhin aufrufen
2. Ein RelayCommand erlaubt auch ein Can..., da machst du dann die Abfrage der Bedingungen.
ich bin da noch ziemlich am Anfang und hab das halt so gelernt
Ich werde es mir mal anschauen.
Aber das hat ja nichts mit meinem eigentlichen Problem zu tun oder?
Den Binding-Pfad "DataContext.UnitsModel.Instance" gibt es nicht.
"Instanz" ist static und kann nicht in Bindings genutzt werden.
An statische Quellen bindet man so:
Sauber oder klug ist das aber nicht, so verlierst Du früher oder später nur den Überblick, was wie worauf zugreift.
Am einfachsten ist, wenn ein Control an das Nächste den DataContext vererbt (passiert automatisch) oder ein untergeordnetes Objekt (klassisches Binding) setzt.
Es kommt vor, dass man (was Du eingangs gefragt hast) nicht mit dem aktuellen DataContext arbeiten kann.
Das ist kommt z.B. beim ItemsControl immer wieder vor, weil im ItemTemplate das Item als DataContext steht und nicht das ursprüngliche ViewModel, was alle Items hat.
Wenn Du nun z.B. an etwas vom ursprünglichen ViewModel binden willst, geht das mit einer RelativeSource, die das ItemsControl sucht.
Und warum setzt Du am Button erst den DataContext, wenn Du die andere Instanz nur an einer Stelle (Command) brauchst und an zwei anderen Stellen nicht?
Pass das Command-Binding so an, dass es das richtige ViewModel sucht und lass den DataContext, wie er ist.
Im Trigger hast Du dann den DataContext, den der Button hat und der hat den DataContext, den dein StackPanel hat und so weiter.
Vielen Dank schonmal für eure Mühen. Leider hab ich mir das alles selber beigebracht und versteh das noch nicht so ganz, was Ihr versucht zu erklären
Könntet ihr das bitte anhand eines Beispiels erklären? Das ist dann für mich verständlicher