猿问

在 ListBoxItem DataTemplate - WPF 内的嵌套控件中处理相同的单击事件

当我们有一个自定义列表框时,它为鼠标左键单击定义了事件处理,并且在 ListBoxItem 数据模板中还有一个附加形状,当它被单击时需要执行一些操作,我们如何处理这些


我有一个 Custom ListBox 女巫试图处理 Click 事件:


在内容视图中:


                <ABC:AListBox

                    ClickCommand="{Binding LaunchCommand}"

                    ...>

                </ABC:AListBox>

在它的数据模板中,我们有这个:


        <DataTemplate x:Key="ThisListTemplate">

            <StackPanel ...>

                <Border Grid.Column="1" VerticalAlignment="Center">

                    <TextBlock

                        FontSize="15"

                        Foreground="White"

                        Text="{Binding Path=ItemTitle}" />      

                </Border>

                <Canvas Height ="12" Width ="12" >

                  <Ellipse Name = "TheEllipse" Stroke="Black" Height ="12"                                  

                           Width ="12" Cursor="Hand" Canvas.Left="185" Canvas.Top="12">                          

                  </Ellipse>

                    <Ellipse.InputBindings>

                        <MouseBinding Gesture="LeftClick"

                                      Command="{Binding DataContext.LaunchFromXamlCommand , RelativeSource={RelativeSource AncestorType=ABC:AListBox}}"

                                      CommandParameter="{Binding}" />

                    </Ellipse.InputBindings>                      

                </Canvas> 

            </StackPanel>                   

        </DataTemplate>

在 MVVM 作为我们的数据上下文中,我们有:


    public ICommand LaunchCommand { get; private set; }

    public DelegateCommand<object> LaunchFromXamlCommand { get; private set; }


在这里,除了通过模板调用的 LaunchFromXamlCommand 之外,我还使用了 2 个不同的命令 LaunchCommand 作为 ICommand。


LaunchFromXamlRun将按预期正常触发。但也正如可以猜测的那样,将有 2 个引发的事件和 2 个命令被触发,我想省略一个并在该形状被击中时忽略一般的 ListBox 事件处理程序。


这样做的最佳解决方案是什么?


仅供参考:( 可能不是那么重要只是为了说明)该应用程序正在使用早期版本的 Prism(不要认为这在这里很重要)并且具有模块化代码,所有内容都在不同的程序集中分离并且代码使用 MVVM 模式。


我希望我们有e.handled = true一个可以在给定场景中使用的机制。


繁花不似锦
浏览 104回答 1
1回答

ITMISS

在列表框中使用该单击处理程序会加剧您的问题。我不知道你是怎么做到的,但这不能只是点击。这可能是 previewmousedown。因为,当然,作为选择项目的一部分,列表框会“吃掉”鼠标按下。解决此问题的一种方法是不使用该列表框预览鼠标。在这里,我将我的行内容放在一个按钮中并绑定按钮的命令。当然,它看起来不像一个按钮。我把圆圈做成一个按钮,并给它一个透明的填充,这样你就可以点击所有的按钮。&nbsp; &nbsp; <ListBox ItemsSource="{Binding People}">&nbsp; &nbsp; &nbsp; &nbsp; <ListBox.ItemContainerStyle>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <Style TargetType="{x:Type ListBoxItem}">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}"/>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </Style>&nbsp; &nbsp; &nbsp; &nbsp; </ListBox.ItemContainerStyle>&nbsp; &nbsp; &nbsp; &nbsp; <ListBox.ItemTemplate>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <DataTemplate>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <Button&nbsp; Command="{Binding DataContext.ItemClickCommand, RelativeSource={RelativeSource AncestorType={x:Type ListBox}}}"&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;CommandParameter="{Binding}"&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <Button.Template>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <ControlTemplate>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <StackPanel Orientation="Horizontal">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <TextBlock Text="{Binding LastName}"/>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <Button Command="{Binding DataContext.EllipseCommand, RelativeSource={RelativeSource AncestorType={x:Type ListBox}}}"&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; >&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <Button.Template>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <ControlTemplate>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <Ellipse Name = "TheEllipse" Stroke="Black"&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Fill="Transparent"&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Height ="12"&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Width="12" Cursor="Hand">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </Ellipse>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </ControlTemplate>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </Button.Template>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </Button>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </StackPanel>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </ControlTemplate>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </Button.Template>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </Button>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </DataTemplate>&nbsp; &nbsp; &nbsp; &nbsp; </ListBox.ItemTemplate>&nbsp; &nbsp; </ListBox>我的视图模型使用中继命令,但(显然)任何 ICommand 的实现都可以。我有上一个问题的人,我做了一些工作。public class MainWindowViewModel : BaseViewModel{&nbsp; &nbsp; private RelayCommand ellipseCommand;&nbsp; &nbsp; public RelayCommand EllipseCommand&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; get&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return ellipseCommand&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ?? (ellipseCommand = new RelayCommand(&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; () =>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Console.WriteLine("CIRCLE clicked");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;));&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; private RelayCommand<Person> itemClickCommand;&nbsp; &nbsp; public RelayCommand<Person> ItemClickCommand&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; get&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return itemClickCommand&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ?? (itemClickCommand = new RelayCommand<Person>(&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (person) =>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine($"You clicked {person.LastName}");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; person.IsSelected = true;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;));&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; private ObservableCollection<Person> people = new ObservableCollection<Person>();&nbsp; &nbsp; public ObservableCollection<Person> People&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; get { return people; }&nbsp; &nbsp; &nbsp; &nbsp; set { people = value; }&nbsp; &nbsp; }&nbsp; &nbsp; public ListCollectionView LCV { get; set; }&nbsp; &nbsp; public MainWindowViewModel()&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; People.Add(new Person { FirstName = "Chesney", LastName = "Brown" });&nbsp; &nbsp; &nbsp; &nbsp; People.Add(new Person { FirstName = "Gary", LastName = "Windass" });&nbsp; &nbsp; &nbsp; &nbsp; People.Add(new Person { FirstName = "Liz", LastName = "McDonald" });&nbsp; &nbsp; &nbsp; &nbsp; People.Add(new Person { FirstName = "Carla", LastName = "Connor" });&nbsp; &nbsp; }}当你点击那个外部按钮时,它会抓住点击。这就是为什么我在命令中设置 IsSelected 以便通过绑定选择您单击的项目。
随时随地看视频慕课网APP
我要回答