Как я могу выполнить привязку команды на MouseEnter StackPanel в WPF? - PullRequest
3 голосов
/ 30 июня 2010

Я использую MVVM.

<ItemsControl ItemsSource="{Binding AllIcons}" Tag="{Binding}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <Label HorizontalAlignment="Right">x</Label>
                <Image Source="{Binding Source}" Height="100" Width="100" />
                <Label HorizontalAlignment="Center" Content="{Binding Title}"/>
            </StackPanel>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

Это выглядит хорошо.Если я вставлю кнопку в панель стека с помощью этой команды:

<Button Command="{Binding Path=DataContext.InvasionCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ItemsControl}}}" CommandParameter="{Binding}"/>

Я смогу захватить команду.Однако я хочу выполнить привязку команды, когда мышь входит в панель стека, а не когда я нажимаю кнопку.

Есть идеи?

Ответы [ 3 ]

2 голосов
/ 30 июня 2010

Неправильно, привязки ввода не решают проблему. Вы можете использовать прикрепленные свойства для этого:

public static class MouseEnterCommandBinding
{
     public static readonly DependencyProperty MouseEnterCommandProperty = DependencyProperty.RegisterAttached(
  "MouseEnterCommand",
  typeof(ICommand),
  typeof(MouseEnterCommandBinding),
  new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender)
);

public static void SetMouseEnterCommand(UIElement element, ICommand value)
{ 
   element.SetValue(MouseEnterCommandProperty, value);
   element.MouseEnter += (s,e) => 
   {
      var uiElement = s as UIElement;
      var command = GetMouseEnterCommand(uiElement); 
      if (command != null && command.CanExecute(uiElement.CommandParameter))
          command.Execute(uiElement.CommandParameter);
   }  
}
public static ICommand GetMouseEnterCommand(UIElement element)
{
    return element.GetValue(MouseEnterCommandProperty) as ICommand;
}

}
2 голосов
/ 02 июля 2010

Сначала вам нужно объявить поведение для ввода мышью. Это в основном переводит событие в команду в вашей ViewModel.

  public static class MouseEnterBehavior
  {
     public static readonly DependencyProperty MouseEnterProperty =
        DependencyProperty.RegisterAttached("MouseEnter",
                                            typeof(ICommand),
                                            typeof(MouseEnterBehavior),
                                            new PropertyMetadata(null, MouseEnterChanged));

    public static ICommand GetMouseEnter(DependencyObject obj)
    {
      return (ICommand)obj.GetValue(MouseEnterProperty);
    }

    public static void SetMouseEnter(DependencyObject obj, ICommand value)
    {
      obj.SetValue(MouseEnterProperty, value);
    }

    private static void MouseEnterChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
    {
      UIElement uiElement = obj as UIElement;

      if (uiElement != null)
        uiElement.MouseEnter += new MouseEventHandler(uiElement_MouseEnter);
    }

    static void uiElement_MouseEnter(object sender, MouseEventArgs e)
    {      
      UIElement uiElement = sender as UIElement;
      if (uiElement != null)
      {
        ICommand command = GetMouseEnter(uiElement);
        command.Execute(uiElement);
      }
    }
  }

Тогда вам просто нужно создать эту команду в вашей модели представления и ссылаться на нее в представлении. Поведение: пространство имен должно указывать на то, где вы создали это поведение. Я использую этот шаблон каждый раз, когда мне нужно преобразовать событие в команду в модели представления.

<Grid>
    <StackPanel behaviors:MouseEnterBehavior.MouseEnter="{Binding MouseEnteredCommand}"
                Height="150"
                Width="150"
                Background="Red">

    </StackPanel>
</Grid>
0 голосов
/ 30 июня 2010

Возможно, вам нужно использовать InputBindings: http://msdn.microsoft.com/en-us/library/system.windows.input.inputbinding.aspx

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