DataTemplate 中的事件处理程序

问题描述 投票:0回答:4

我在数据模板中有 WPF

ComboBox
ListBox
中有很多组合框),我想处理输入按钮。如果是例如,那就很容易了按钮 - 我会使用 Command + 相对绑定路径等。不幸的是,我不知道如何使用命令处理按键或如何从模板设置事件处理程序。 有什么建议吗?

wpf event-handling datatemplate
4个回答
15
投票

您可以按照设置模板的样式使用 EventSetter:

<Style TargetType="{x:Type ListBoxItem}">
      <EventSetter Event="MouseWheel" Handler="GroupListBox_MouseWheel" />
      <Setter Property="Template" ... />
</Style>

4
投票

我通过使用常用的事件处理程序解决了我的问题,在该处理程序中,我遍历可视化树,找到相应的按钮并调用它的命令。 如果其他人也有同样的问题,请发表评论,我将提供更多实现细节。

UPD

这是我的解决方案:

我在可视化树中搜索按钮,然后执行与按钮关联的命令。

查看.xaml:

<ComboBox KeyDown="ComboBox_KeyDown"/>
<Button Command="{Binding AddResourceCommand}"/>

View.xaml.cs:

private void ComboBox_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Enter)
    {
        var parent = VisualTreeHelper.GetParent((DependencyObject)sender);
        int childrenCount = VisualTreeHelper.GetChildrenCount(parent);

        for (int i = 0; i < childrenCount; i++)
        {
            var child = VisualTreeHelper.GetChild(parent, i) as Button;
            if (null != child)
            {
                child.Command.Execute(null);
            }
        }
    }
} 

0
投票

本文有一种方法可以将任何

Event
路由到
Command

http://nerobrain.blogspot.nl/2012/01/wpf-events-to-command.html


0
投票

另一个简单的选择是像这样派生控件

  public class MyTextbox : TextBox
  {
    private void OnKeyDown(object sender, KeyEventArgs e)
    {
      e.Handled = true;
      //...
      return;
    }

    private void OnGotKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
    {
      //E.g. delete the content when focused
      e.Handled = true;
      this.Text = null;
      return;
    }

    public override void OnApplyTemplate()
    {
      base.OnApplyTemplate();
      this.GotKeyboardFocus += OnGotKeyboardFocus;
      this.KeyDown += OnKeyDown;
    }
  }

如果您只是希望控件始终像这样运行,那么您当然可以直接重写虚拟方法,而不是在 OnApplyTemplate() 中添加事件,例如

    protected override void OnGotKeyboardFocus(System.Windows.Input.KeyboardFocusChangedEventArgs e)
    {
      e.Handled = true;
      this.Text = null;
      return;
    }
© www.soinside.com 2019 - 2024. All rights reserved.