2017-07-15 4 views
0

Wie steuern wir, was passiert, wenn eines der übergeordneten Objekte im Eigenschaftspfad null ist? Zum Beispiel:Was ist, wenn das übergeordnete Objekt im Eigenschaftenpfad null ist?

<Button Command="{Binding ActiveDrawing.PrintCommand}" /> 

Was passiert, wenn ActiveDrawing ist null? Ich möchte, dass diese Schaltfläche in diesem Fall deaktiviert wird, aber WPF behält sie aktiviert. Ich habe versucht Einstellung FallBackValue auf null, wie folgt aus:

<Button Command="{Binding ActiveDrawing.PrintCommand, FallbackValue={x:Null}}" /> 

aber es macht keinen Unterschied machen. Die Schaltfläche bleibt aktiviert.

N.B. Einstellung TargetNullValue zu {x:Null} macht auch keinen Unterschied.

+0

Implementieren Sie einen PrintCommand, und überprüfen Sie in CanExecute den ActiveDrawing.PrintCommand. Entfernen Sie die direkte Kupplung. – Aphelion

+0

Ich habe 'PrintCommand' und' CanExecute' implementiert. Problem ist, dass WPF nicht so weit gehen wird, um 'CanExecute' auszuwerten, wenn' ActiveDrawing' gleich null ist. Wenn Sie mich bitten, ALLE meine Befehle von ActiveDrawing in den aktuellen Kontext zu verschieben, ist das ein zu großes Unterfangen. Ich glaube, es sollte einen einfachen Weg geben, einen Wert anzugeben, falls die Bewertung der Bindung aus irgendeinem Grund fehlschlägt. – dotNET

+0

Tatsächlich hoffte ich, dass 'FallbackValue' nur für diesen Zweck gedacht ist, aber irgendwie funktioniert es nicht so, wie ich es erwartet hatte. – dotNET

Antwort

1

Ich habe die folgende Problemumgehung für jetzt entwickelt.

  1. eine neue Klasse erstellen NullCommand genannt:

    Public Class NullCommand 
        Implements ICommand 
    
        Public Event CanExecuteChanged As EventHandler Implements ICommand.CanExecuteChanged 
    
        Public Sub Execute(parameter As Object) Implements ICommand.Execute 
        End Sub 
    
        Public Function CanExecute(parameter As Object) As Boolean Implements ICommand.CanExecute 
        Return False 
        End Function 
    End Class 
    
  2. Erstellen Sie eine Instanz der Klasse im Abschnitt Ressourcen:

    <Window.Resources> 
        <vm:NullCommand x:Key="NullCommand" /> 
    </RibbonGroup.Resources> 
    
  3. Verwenden Sie dieses Objekt als FallbackValue:

    <Button Command="{Binding ActiveDrawing.PrintCommand, FallbackValue={StaticResource NullCommand}" /> 
    

Hurra! Es klappt. Wenn der Bindungseigenschaftspfad aus irgendeinem Grund fehlschlägt, wird Ihre Schaltfläche deaktiviert.

TBH, ich mag diese Lösung aus einem einzigen Grund nicht. FallbackValue sollte diese Situation behandelt haben.

Verwandte Themen