Присоединение пользовательского DependencyProperty к StackPanel в WPF? - PullRequest
0 голосов
/ 08 июля 2010

Я пытаюсь навести указатель мыши на панель стека в WPF с помощью пользовательского DependencyProperty (StackPanels не обрабатывают событие MouseEnter).

Я создал класс для DependencyProperty, например так:

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

Мой вид выглядит следующим образом:

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

И моя ViewModel выглядит так:

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

Обновление

Мне удалось получить код для компиляции и запуска, однако привязка не происходит.Я не могу понять, почему.

Ответы [ 2 ]

1 голос
/ 08 июля 2010

Вы зарегистрировали свойство зависимостей как MouseEnter ed Command, но попробуйте выполнить привязку к MouseEnterCommand.

В примечании стороны привязка не установит свойство DependencyProperty с помощью Setзвонок, который вы предоставили;он будет вызывать SetValue напрямую.Вам нужно будет передать обратный вызов в RegisterAttached, чтобы получить уведомление.

1 голос
/ 08 июля 2010

Я считаю, что это ваша проблема:

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

первый GetType должен быть типом свойства (с вами все в порядке)второй GetType должен быть типом содержащего класса, в вашем случае "MouseEnterBehavior"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...