【问题标题】:How to trap button click event inside listbox item template如何在列表框项目模板中捕获按钮单击事件
【发布时间】:2014-06-04 19:06:02
【问题描述】:

我有一个带有文本框的列表框来显示列表项。我想要有可编辑的文本框,所以我将按钮放在列表框内以选择文本框。我想触发该列表框的按钮单击事件,但我不能。这是我的代码:

         <ListBox HorizontalAlignment="Left" Name="ListTwo" Height="auto" Margin="134.53,15.934,0,0" VerticalAlignment="Top" Width="202.308" ItemsSource="{Binding . ,Source=CollectionUrl,BindsDirectlyToSource=True}" BorderThickness="0" >
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="100" />
                        <ColumnDefinition Width="50" />
                    </Grid.ColumnDefinitions>
                    <RadioButton>
                        <TextBox Name="TextBoxList" Text="{Binding Path=urlString, Mode=TwoWay}" Width="150">
                            <TextBox.Style>
                                <Style TargetType="TextBox">
                                    <Style.Triggers>
                                        <Trigger Property="IsFocused" Value="True">
                                            <Setter Property="Foreground" Value="Black"/>
                                            <Setter Property="IsReadOnly" Value="False" />
                                            <Setter Property="BorderThickness" Value="0.5"/>
                                        </Trigger>
                                        <Trigger Property="IsFocused" Value="False">
                                            <Setter Property="Foreground" Value="Gray"/>
                                            <Setter Property="IsReadOnly" Value="True" />
                                            <Setter Property="BorderThickness" Value="0"/>
                                        </Trigger>
                                    </Style.Triggers>
                                </Style>
                            </TextBox.Style>
                        </TextBox>
                    </RadioButton>
                    <Button Content="Save" Grid.Column="1" Tag="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=ListBox}}" Click="Button_Click_2">
                        <Button.Style>
                            <Style TargetType="Button">
                                <Setter Property="Visibility" Value="Collapsed" />
                                <Style.Triggers>
                                    <DataTrigger Binding="{Binding ElementName=TextBoxList, Path=IsFocused}" Value="True">
                                        <Setter Property="Visibility" Value="Visible" />
                                        <Setter Property="ClickMode" Value="Press"/>
                                    </DataTrigger>
                                </Style.Triggers>
                            </Style>
                        </Button.Style>
                    </Button>
                </Grid>
            </DataTemplate>

        </ListBox.ItemTemplate>

    </ListBox>

谁知道如何捕获按钮的点击事件?

【问题讨论】:

    标签: wpf listbox


    【解决方案1】:

    您是否尝试在 ListBox 中为 Button 添加事件。这将捕获事件。

    Button.Click="OnClick"
    

    像这样:

    <ListBox HorizontalAlignment="Left" Name="ListTwo" Height="auto" Margin="134.53,15.934,0,0" VerticalAlignment="Top" Width="202.308" ItemsSource="{Binding . ,Source=CollectionUrl,BindsDirectlyToSource=True}" BorderThickness="0" Button.Click="OnClick">
    

    那么你的活动:

    private void OnClick(object sender, RoutedEventArgs e)
    {
        var originalSource = e.OriginalSource;
        // Do your work here
    }
    

    但是,您还有第二个问题。您的按钮样式正在阻止您的事件触发。它可以在没有样式的情况下工作,但不会在样式中触发。将样式更改为 ListBoxItem.IsSelected。然后,如果您选择一个 TextBox,则选择 ListBoxItem。

    <ListBox HorizontalAlignment="Left" Name="ListTwo" Height="auto" Margin="134.53,15.934,0,0" VerticalAlignment="Top" Width="202.308" ItemsSource="{Binding . ,Source=CollectionUrl,BindsDirectlyToSource=True}" BorderThickness="0" Button.Click="OnClick">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="100" />
                        <ColumnDefinition Width="50" />
                    </Grid.ColumnDefinitions>
                    <RadioButton>
                        <TextBox Name="TextBoxList" Text="{Binding Path=urlString, Mode=TwoWay}" Width="150">
                            <TextBox.Style>
                                <Style TargetType="TextBox">
                                    <Style.Triggers>
                                        <Trigger Property="IsFocused" Value="True">
                                            <Setter Property="Foreground" Value="Black"/>
                                            <Setter Property="IsReadOnly" Value="False" />
                                            <Setter Property="BorderThickness" Value="0.5"/>
                                        </Trigger>
                                        <Trigger Property="IsFocused" Value="False">
                                            <Setter Property="Foreground" Value="Gray"/>
                                            <Setter Property="IsReadOnly" Value="True" />
                                            <Setter Property="BorderThickness" Value="0"/>
                                        </Trigger>
                                    </Style.Triggers>
                                </Style>
                            </TextBox.Style>
                        </TextBox>
                    </RadioButton>
                    <Button Content="Save" Grid.Column="1">
                        <Button.Style>
                            <Style TargetType="Button">
                                <Setter Property="Visibility" Value="Collapsed" />
                                <Style.Triggers>
                                    <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}}, Path=IsSelected}" Value="True">
                                        <Setter Property="Visibility" Value="Visible" />
                                        <Setter Property="ClickMode" Value="Press"/>
                                    </DataTrigger>
                                </Style.Triggers>
                            </Style>
                        </Button.Style>
                    </Button>
                </Grid>
            </DataTemplate>
        </ListBox.ItemTemplate>
        <ListBox.ItemContainerStyle>
            <Style TargetType="{x:Type ListBoxItem}">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding IsKeyboardFocusWithin, RelativeSource={RelativeSource Self}}" Value="True">
                        <DataTrigger.EnterActions>
                            <BeginStoryboard>
                                <Storyboard>
                                    <BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="(ListBoxItem.IsSelected)">
                                        <DiscreteBooleanKeyFrame KeyTime="0" Value="True"/>
                                    </BooleanAnimationUsingKeyFrames>
                                </Storyboard>
                            </BeginStoryboard>
                        </DataTrigger.EnterActions>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </ListBox.ItemContainerStyle>
    </ListBox>
    

    希望对您有所帮助。

    【讨论】:

    • 我想要按钮样式,因为我想要按钮对文本框焦点数据触发器可见。如果你知道的话还有其他方法。
    • 你正在做的事情是不可能的。该按钮仅在 TextBox IsFocused 时可见,但一旦您尝试单击 Button,TextBox 就不再是焦点。选择要使用的 TextBox.IsFocused 以外的其他属性。也许 ListBoxItem.IsSelected 之类的。
    • ListBoxItem.IsSelcted 有效,但您还必须遵循:stackoverflow.com/questions/2191922/…
    • 这对我不起作用。 Button.OnClick 似乎什么也没做。
    • 没关系,刚刚学会了关闭 IsHitTestVisible 关闭点击:(
    【解决方案2】:

    您有多种选择,但我只给您两个最好的选择,而不使用第三方框架。

    首先是通过System.Windows.Interactions 并将其放入TextBox 中。这将在您的ViewModel

    中处理
    <i:Interaction.Triggers>
                <i:EventTrigger EventName="Click" >
                    <i:InvokeCommandAction Command="{Binding ClickCommand}" />
                </i:EventTrigger>
    </i:Interaction.Triggers>
    

    其次是通过EventSetter,这个会在View后面处理

    <Style TargetType="ListBoxItem">
                 <EventSetter Event="MouseDoubleClick" Handler="TextBoxClick"/>
    </Style>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-13
      • 1970-01-01
      • 2014-04-28
      • 2013-01-30
      • 1970-01-01
      • 2023-04-03
      • 2012-02-23
      • 1970-01-01
      相关资源
      最近更新 更多