当我们有一个定制的列表框并定义了鼠标左键单击的事件处理程序时,还有一个ListBoxItem数据模板中的附加形状需要在被单击时执行一些操作,我们该如何处理这些情况?
我有一个尝试处理单击事件的自定义ListBox:
在ContentView中:
在它的数据模板中,我们有这个:
我有一个尝试处理单击事件的自定义ListBox:
在ContentView中:
<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; }
// Initialization on load:
this.LaunchCommand = new DelegateCommand(this.LaunchRun);
this.LaunchFromXamlCommand = new DelegateCommand<object>(this.LaunchFromXamlRun);
//---------
private void LaunchFromXamlRun(object param)
{
TheListItem app = (TheListItem)param;
...
}
private void LaunchRun()
{ ... }
在这里我使用了两个不同的命令:LaunchCommand作为ICommand,再加上通过模板调用的LaunchFromXamlCommand。
LaunchFromXamlRun
将触发并按预期运行。
但是可以猜到,将会有2个事件被触发和2个命令被触发,而我想省略一个并在该形状被点击时忽略一般的ListBox事件处理程序。
做到这一点的最佳解决方案是什么?
FYI:(也许只是一条注释,不太重要)应用程序正在使用早期版本的Prism(不认为这里很重要),并且具有模块化代码,所有内容都分开放置在不同的程序集中,代码使用MVVM模式。
我希望我们在给定情境中能够使用类似e.handled=true
的机制。