2010-10-21 15 views
0

Je rencontre des problèmes lors de la connexion d'une commande de décocher à une case à cocher. Ou plus correct, je ne sais pas comment le coder. Voici mon code pour la commande de vérification, comment devrait-il chercher à décocher aussi travailler?Commande de case à cocher, cocher - OK, décocher NON ok, comment lier la commande uncheck?

Vue:

<CheckBox commands:Checked.Command="{Binding CheckCommand}" 
IsChecked="False"></CheckBox> 

ViewModel:

Private _CheckCommand As DelegateCommand(Of Object) 

CheckCommand = New DelegateCommand(Of Object)(AddressOf Checked) 

Private Sub Checked(ByVal parameter As Object) 

End Sub 

Commande:

Public Class ToggleCheckedCommandBehaviour 
    Inherits CommandBehaviorBase(Of CheckBox) 

    Public Sub New(ByVal checkableObject As CheckBox) 
     MyBase.New(checkableObject) 
     AddHandler checkableObject.Checked, AddressOf checkableObject_Checked 
    End Sub 

    Private Sub checkableObject_Checked(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) 
     CommandParameter = TargetObject.Name 
     ExecuteCommand() 
    End Sub 
End Class 

Public NotInheritable Class Checked 

    Private Sub New() 
    End Sub 

    Private Shared ReadOnly SelectedCommandBehaviorProperty As DependencyProperty = _ 
    DependencyProperty.RegisterAttached("SelectedCommandBehavior", _ 
             GetType(ToggleCheckedCommandBehaviour), _ 
             GetType(Checked), _ 
             Nothing) 

    Private Shared ReadOnly CommandProperty As DependencyProperty = _ 
    DependencyProperty.RegisterAttached("Command", _ 
             GetType(ICommand), _ 
             GetType(Checked), _ 
             New PropertyMetadata(AddressOf OnSetCommandCallback)) 


    Public Shared Sub SetCommand(ByVal CheckBox As CheckBox, ByVal command As ICommand) 
     CheckBox.SetValue(CommandProperty, command) 
    End Sub 

    Public Shared Function GetCommand(ByVal CheckBox As CheckBox) As ICommand 
     Return TryCast(CheckBox.GetValue(CommandProperty), ICommand) 
    End Function 

    Private Shared Sub OnSetCommandCallback(ByVal dependencyObject As DependencyObject, ByVal e As DependencyPropertyChangedEventArgs) 
     Dim CheckBox = TryCast(dependencyObject, CheckBox) 
     If Not CheckBox Is Nothing Then 
      Dim behavior = GetOrCreateBehavior(CheckBox) 
      behavior.Command = TryCast(e.NewValue, ICommand) 
     End If 
    End Sub 

    Private Shared Function GetOrCreateBehavior(ByVal CheckBox As CheckBox) As ToggleCheckedCommandBehaviour 
     Dim behavior = TryCast(CheckBox.GetValue(SelectedCommandBehaviorProperty), ToggleCheckedCommandBehaviour) 
     If behavior Is Nothing Then 
      behavior = New ToggleCheckedCommandBehaviour(CheckBox) 
      CheckBox.SetValue(SelectedCommandBehaviorProperty, behavior) 
     End If 
     Return behavior 
    End Function 

End Class 
End Namespace 

Comme mentionné la commande de contrôle fonctionne très bien, et la commande et la méthode qui lui est connecté obtient les incendies, que dois-je faire pour que la case à cocher fonctionne aussi? Pour info J'utilise PRISM, CAL, MVVM et SL4 - dans VB.NET

Répondre

0

Le fait que la commande Vérifié fonctionne correctement signifie que le comportement attaché a été implémenté correctement. Cela dit, le comportement surveille seulement un événement unique que vous indiquez dans cette ligne:

AddHandler checkableObject.Checked, AddressOf checkableObject_Checked 

Ainsi, vous pouvez vous inscrire à l'événement Checked du contrôle CheckBox. Comme vous souhaitez que le contrôle de la case à cocher ne soit pas cochée, vous devez simplement créer un autre comportement joint à l'aide de l'événement Unchecked. Cela suppose que vous voulez exécuter une commande différente lorsque le bouton est coché/décoché. Si vous utilisez la même commande, la liaison à la propriété Command devrait suffire.

J'espère que cela aide.