7

我有一个为 ListBoxItems 定义了样式的 ListBox。在这种风格中,我有一些标签和一个按钮。一个那个按钮,我想定义一个可以在我的页面(或使用该样式的任何页面)上处理的单击事件。如何在我的 WPF 页面上创建一个事件处理程序来处理来自我的 ListBoxItems 样式的事件?

这是我的风格(仅限受影响的代码):

<Style x:Key="UsersTimeOffList"  TargetType="{x:Type ListBoxItem}">
... 
<Grid>
<Button x:Name="btnRemove" Content="Remove" Margin="0,10,40,0" Click="btnRemove_Click" />
</Grid>
</Style>

谢谢!

4

3 回答 3

10

看看RoutedCommand

在 myclass 某处定义您的命令,如下所示:

    public static readonly RoutedCommand Login = new RoutedCommand();

现在用这个命令定义你的按钮:

    <Button Command="{x:Static myclass.Login}"  />  

您可以使用 CommandParameter 获取更多信息。

现在最后但并非最不重要,开始听你的命令:

在您希望做一些好事的类的构造函数中,您放置:

    CommandBindings.Add(new CommandBinding(myclass.Login, ExecuteLogin));

或在 XAML 中:

   <UserControl.CommandBindings>
        <CommandBinding Command="{x:Static myclass.Login}" Executed="ExecuteLogin" />
   </UserControl.CommandBindings>

你实现了 CommandBinding 需要的委托:

    private void ExecuteLogin(object sender, ExecutedRoutedEventArgs e)
    {
          //Your code goes here... e has your parameter!
    }

你可以开始在你的视觉树的任何地方听这个命令!

希望这可以帮助

PS您还可以使用 CanExecute 委托定义 CommandBinding,如果 CanExecute 这么说,它甚至会禁用您的命令:)

PPS 这里是另一个例子:RoutedCommands in WPF

于 2008-08-26T14:51:05.203 回答
6

正如 Arcturus 所发布的,RoutedCommands 是实现这一目标的好方法。但是,如果 DataTemplate 中只有一个按钮,那么这可能会更简单一些:

您实际上可以从主机 ListBox 处理任何按钮的 Click 事件,如下所示:

<ListBox Button.Click="removeButtonClick" ... />

ListBox 中包含的任何按钮都将在单击时触发该事件。在事件处理程序中,您可以使用 e.OriginalSource 来获取对被单击按钮的引用。

显然,如果您的 ListBoxItems 有多个按钮,这太简单了,但在许多情况下它工作得很好。

于 2008-10-10T03:44:53.923 回答
0

您可以创建一个用户控件 (.ascx) 来容纳列表框。然后为页面添加公共事件。

Public Event btnRemove()

然后在用户控件中的按钮单击事件上

RaiseEvent btnRemove()

您还可以像任何其他方法一样通过事件传递对象。这将允许您的用户控件告诉您的页面要删除的内容。

于 2008-08-26T14:27:40.517 回答