wpf DataTemplate中的事件处理程序

34gzjxbg  于 2023-06-24  发布在  其他
关注(0)|答案(4)|浏览(113)

我有一个数据模板内的WPF组合框(在列表框组合框很多),我想处理回车按钮。如果是例如,那就容易了。一个按钮-我会使用命令+相对绑定路径等。不幸的是,我不知道如何处理按键与命令或如何设置事件处理程序从模板。有什么建议吗?

a9wyjsp7

a9wyjsp71#

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

UPD

以下是我的解决方案:
我在可视化树中搜索按钮,然后执行与按钮相关联的命令。
View.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);
            }
        }
    }
}
wvyml7n5

wvyml7n53#

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

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;
    }
jq6vz3qz

jq6vz3qz4#

您可以在设置模板的样式中使用EventSetter:

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

相关问题