带按钮的WPF列表框样式

时间:2008-08-26 13:54:45

标签: c# wpf

我有一个ListBox,它具有为Lis​​tBoxItems定义的样式。在这种风格中,我有一些标签和一个按钮。一个按钮,我想定义一个可以在我的页面(或任何使用该样式的页面)上处理的点击事件。如何在我的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 个答案:

答案 0 :(得分:10)

看看RoutedCommand s。

在某个地方的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

答案 1 :(得分:6)

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

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

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

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

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

答案 2 :(得分:0)

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

Public Event btnRemove()

然后在usercontrol中的按钮单击事件

RaiseEvent btnRemove()

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