WPF带有按钮的Listbox样式

7

我有一个ListBox,其中定义了ListBoxItems的样式。在这个样式中,我有一些标签和一个按钮。在按钮上,我想定义一个可在我的页面上处理的点击事件(或使用该样式的任何页面)。如何在我的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>

感谢您!
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返回false,甚至会禁用您的命令 :)

PPS 这里是另一个示例:WPF中的路由命令


6
如Arcturus所述,RoutedCommands是实现此目的的好方法。但是,如果您的DataTemplate中只有一个按钮,则可能会更简单一些:
您实际上可以从主机ListBox处理任何按钮的Click事件,如下所示:
<ListBox Button.Click="removeButtonClick" ... />

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

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


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

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

RaiseEvent btnRemove()

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接