gebunden Button deaktivieren, wenn binding = null

  • WPF

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von asusdk.

    gebunden Button deaktivieren, wenn binding = null

    Hallo Ihr lieben,

    ich habe mal eine kleine Frage, das MainWindow ist auf das MainViewModel gebunden (Datacontext) in diesem, gibts eine ObservableCollection(of OutlookItemViewModel).
    Ein Grid im MainWindow hat als DataContext das Property SelectedOutlookItemViewmodel, welches ja im MainViewmodel liegt

    Im OutlookItemViewModel, gibt es ein Command welches an einen Button im MainWindow gebunden ist. Alles mit einer kleinen Ausnahme funktioniert so einwandfrei, ABER wenn kein OutlookViewModelItem ausgewählt ist, ist das Grid ja wieder an Nichts gebunden.

    Das daraus resultierende Problem ist, das wenn ich kein Item angewählt habe, mir das Grid natürlichwerweise mit leeren Controls aufwartet (solls ja auch) aber der Button welcher im Grid liegt, somit auch keine Bindung zum Command hat, der Button wird mir also isEnabled=true angezeigt.

    Wie könnte ich es bewerkstelligen, das der Button solange er das Command ja nicht finden kann, als IsEnabled=False angezeigt wird ? Wenn ich den zusätzlich zum Binding einfach auf IsEnabled=False setze, ändert sich dies auch nicht, selbst wenn dann ein Item angewählt und Ihm sein Commando somit verfügbar wird.

    Ich hoffe ich hab mich hier klar genug ausgedrückt. Also im Prinzip: If Binding isnot vorhanden then bleib deaktiviert.


    LG und Danke



    Nachtrag:
    Bisher hab ich als Lösung einen Style gefunden, ich lasse das Thema dennoch erstmal offen, falls jemand noch einen eleganteren Weg kennt

    XML-Quellcode

    1. ​<Button Content="Generate Text"
    2. Grid.Row="2"
    3. Grid.ColumnSpan="2"
    4. Command="{Binding CreateTextCommand}">
    5. <Button.Style>
    6. <Style TargetType="Button">
    7. <Style.Triggers>
    8. <Trigger Property="Command" Value="{x:Null}">
    9. <Setter Property="IsEnabled" Value="False" />
    10. </Trigger>
    11. </Style.Triggers>
    12. </Style>
    13. </Button.Style>
    14. </Button>
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If

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

    Hallo @asusdk

    Ja, ich hätte es auch mit einem Style gelöst.

    Ich würde aber das problem anders angehen. Zum einen würde ich mal zusehen das es garnicht passiert das kein Datensatz gewählt ist indem ich im ViewModel nach füllen der ObservableCollection gleichmal mit .FirstOrDefault() das erste Element als selektiert setzte. Und solle es dennoch mal passieren das "SelectedOutlookItemViewmodel" mal null ist dann würde ich (auch über einen Style) überhaupt etwas anderes anzeigen. z.b. einfach ein Label in der Mitte "Kein Datensatz markiert".

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

    Guten Morgen Sascha,

    ja, normalerweise würde ich genau das auch tun, allerdings sind nach Start des Programms noch keinerlei Datensätze vorhanden, da die zu bearbeitenden Dateien, erst nach Start des Programms per Drag&Drop hinzugefügt werden.
    Die Idee mit einem Style der gleich etwas gänzlich anderes anzeigt, finde ich gut, das würde ich dann direkt auf dem Grid anwenden oder ?


    LG und Danke
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If
    Hallo

    Ich kenne deine View nicht und ich würde es auch mit DataTemplates lösen, aber Style geht natürlich auch.
    Im grunde sollte der komplette Bereich der an das Selected..... gebunden ist ha ausgeblendet werden wenn keine Datenvorhanden.

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