2010-07-07 4 views
0

Je suis en train de faire une souris sur un panneau de pile dans WPF en utilisant un DependencyProperty personnalisé (StackPanels ne gère pas l'événement MouseEnter).Attacher un DependencyProperty personnalisé à un StackPanel dans WPF?

J'ai créé une classe pour la DependencyProperty comme ceci:

Public Class MouseEnterBehavior 
    Public Shared Property MouseEnterProperty As DependencyProperty = 
    DependencyProperty.RegisterAttached("MouseEnter", 
             GetType(ICommand), 
             GetType(MouseEnterBehavior), 
             New PropertyMetadata(Nothing, AddressOf MouseEnterChanged)) 

    Public Shared Function GetMouseEnter(ByVal obj As DependencyObject) As ICommand 
    Return CType(obj.GetValue(MouseEnterProperty), ICommand) 
    End Function 

    Public Shared Sub SetMouseEnter(ByVal obj As DependencyObject, ByVal value As ICommand) 
    obj.SetValue(MouseEnterProperty, value) 
    End Sub 

    Public Shared Sub MouseEnterChanged(ByVal obj As DependencyObject, ByVal e As DependencyPropertyChangedEventArgs) 
    Dim element As UIElement = TryCast(obj, UIElement) 
    If element IsNot Nothing Then 
     AddHandler element.MouseEnter, AddressOf uiElement_MouseEnter 
    End If 
    End Sub 

    Public Shared Sub uiElement_MouseEnter(ByVal sender As Object, ByVal e As EventArgs) 
    Dim uiElement As UIElement = TryCast(sender, UIElement) 
    Dim command As ICommand = GetMouseEnter(uiElement) 
    If command IsNot Nothing And command.CanExecute(uiElement) Then 
     command.Execute(uiElement) 
    End If 
    End Sub 
End Class 

Mon Voir ressemble à ceci:

<Window x:Class="MainWindowView" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:vm="clr-namespace:WpfApplication1" 
    Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <StackPanel Height="76" vm:MouseEnterBehavior.MouseEnterCommand="{Binding MouseEnteredCommand}" HorizontalAlignment="Left" Margin="212,117,0,0" VerticalAlignment="Top" Width="88" Background="#72000000" /> 
    </Grid> 
</Window> 

Et mon ViewModel ressemble à ceci:

Public Class MainWindowViewModel 
    Inherits ViewModelBase 
    Implements INotifyPropertyChanged 

    Private cmdMouseCommand As RelayCommand 

    Public ReadOnly Property MouseEnteredCommand As ICommand 
    Get 
     If cmdMouseCommand Is Nothing Then 
     cmdMouseCommand = New RelayCommand(AddressOf OnMouseEnterCommand) 
     End If 
     Return cmdMouseCommand 
    End Get 
    End Property 

    Private Sub OnMouseEnterCommand(ByVal obj As Object) 
    ''//Do something 
    End Sub 
End Class 

Mettre à jour

J'ai été en mesure d'obtenir le code pour compiler et exécuter, mais la liaison ne se produit pas. Je n'arrive pas à comprendre pourquoi.

Répondre

1

Vous avez enregistré la propriété de dépendance en tant que MouseEnter ed Command, mais essayez de vous lier à MouseEnterCommand. D'un côté, la liaison ne définit pas votre DependencyProperty en utilisant l'appel Set que vous avez fourni; il appellera SetValue directement. Vous devrez passer un rappel dans RegisterAttached afin que vous soyez averti.

+0

merci beaucoup pour votre aide. Je pense que je commence à comprendre comment cela fonctionne un peu mieux. J'ai apporté quelques modifications au code ci-dessus montrant ma tentative de configurer un rappel pour le DP. Cependant, la liaison de commande ne semble pas se produire. Je mets des points d'arrêt sur chaque méthode et aucun d'eux n'est touché. Une idée de ce que je fais mal? – Daniel

1

Je crois que ceci est votre problème:

DependencyProperty.RegisterAttached("MouseEnteredCommand", 
            GetType(ICommand), 
            GetType(MainWindowViewModel) 

la première GetType doit être le type de la propriété (vous êtes OK ici)
la deuxième GetType shuold le type de la classe contenant, dans votre cas "MouseEnterBehavior"

Questions connexes