代码之家  ›  专栏  ›  技术社区  ›  Vaccano

WPF-捕获添加到样式(ListBoxItem)的按钮的单击。

  •  1
  • Vaccano  · 技术社区  · 15 年前

    我为ListBoxItem的模板添加了一个按钮。我想知道如何点击按钮(而不是选择ListBoxItem)。

    这个按钮在用户界面中单击很好,但我似乎找不到如何连接代码,所以我可以捕获它。

    我尝试使用:

    <EventSetter Event="Click" Handler="Button_Click"></EventSetter>
    

    但这似乎是在ListBoxItem上。我看不出把它连到按钮上的方法。

    以下是我的工作风格,如果它有帮助:

    <Window x:Class="WIAssistant.Main"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="My App" Height="587" Width="1246" Name="MainForm" FontSize="14">
    
    <Window.Resources>
      <Style x:Key="CheckBoxListStyle" TargetType="ListBox">
         <Style.Resources>
            <Style TargetType="ListBoxItem">
              <Setter Property="Template">
                 <Setter.Value>
                     <ControlTemplate TargetType="ListBoxItem">
                       <Grid ScrollViewer.CanContentScroll="True" Margin="2">
                          <Grid.ColumnDefinitions>
                          <ColumnDefinition Width="Auto" />
                          <ColumnDefinition Width="Auto" />
                          <ColumnDefinition Width="Auto" />
                          <ColumnDefinition />
                       </Grid.ColumnDefinitions>
                       <CheckBox VerticalAlignment="Center" IsChecked="{Binding IsSelected,
                                                     RelativeSource={RelativeSource TemplatedParent},
                                                     Mode=TwoWay}" />
                       <TextBlock VerticalAlignment="Center" Grid.Column="1" Margin="5,0,5,0" Text="{Binding Id}" />
                       <TextBlock VerticalAlignment="Center" Grid.Column="2" Margin="5,0,5,0" Text="{Binding Title}" />
                       <Button HorizontalAlignment="Right" Grid.Column="3" Margin="5,0,5,0" Width="25">-&gt;</Button>
                     </Grid>
                   </ControlTemplate>
                 </Setter.Value>
              </Setter>
            </Style>
          </Style.Resources>
          <Setter Property="ItemsPanel">
            <Setter.Value>
               <ItemsPanelTemplate>
                 <WrapPanel Orientation="Vertical"  />
               </ItemsPanelTemplate>
             </Setter.Value>
          </Setter>
        <Setter Property="BorderThickness" Value="0" />
        <Setter Property="Background" Value="Transparent" />
      </Style>
    </Window.Resources>
    
    ... (In a grid in later code)
    
     <ListBox SelectionMode="Multiple" Style="{StaticResource CheckBoxListStyle}"
              Name="lstQueryResults" SelectionChanged="lstQueryResults_SelectionChanged">
     </ListBox>
    

    任何捕获按钮点击的方法都会受到赞赏。(注意,只需在按钮中添加一个单击事件,就会出现一个错误,即使用 EventSetter .

    2 回复  |  直到 13 年前
        1
  •  2
  •   Joaquim Rendeiro    15 年前

    事件处理程序的问题似乎是样式内部样式。在窗口资源中也保留样式,请尝试以下操作:

    <Window.Resources>
        <DataTemplate x:Key="ListBoxItemTemplate">
            <Grid ScrollViewer.CanContentScroll="True" Margin="2">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition />
                </Grid.ColumnDefinitions>
                <CheckBox VerticalAlignment="Center" IsChecked="{Binding IsSelected, Mode=TwoWay}" />
                <TextBlock VerticalAlignment="Center" Grid.Column="1" Margin="5,0,5,0" Text="{Binding Id}" />
                <TextBlock VerticalAlignment="Center" Grid.Column="2" Margin="5,0,5,0" Text="{Binding Title}" />
                <Button HorizontalAlignment="Right" Grid.Column="3" Margin="5,0,5,0" Width="25" Click="Button_Click">-&gt;</Button>
            </Grid>
        </DataTemplate>
    </Window.Resources>
    

    +

    <ListBox ItemTemplate="{StaticResource ListBoxItemTemplate}" />
    

    模板中的eventsetter也可以工作,但显然vs中的设计视图停止工作。

        2
  •  0
  •   Richard Szalay    15 年前

    如果模板被设置为数据模板(可能通过模板选择器),则可以将ICommand绑定到按钮,然后在演示者/视图模型/任何对象中处理命令的执行。

    除此之外,我不确定,尽管我不是WPF专家。