c# - 从 ListViewItem 单击 UWP 按钮
问题描述
我真的希望有更多经验的人能给我一些指点。
我对 UWP 项目进行了以下设置:
A
ListView
在我的应用程序页面内的 XAML 中声明,Tubes.xaml
:<ListView Name="TubesGrid" ItemsSource="{x:Bind TubeItems, Mode=TwoWay}" ItemTemplateSelector="{StaticResource TubeTemplateSelector}" IsItemClickEnabled="True" ItemClick="TubesGrid_ItemClick" SelectionChanged="TubesGrid_SelectionChanged">
A
UserControl
作为ListViewItem
(UserControl.Resources
) 的模板:<local:TubeTemplateSelector x:Key="TubeTemplateSelector" TubeTemplate="{StaticResource TubeTemplate}"> </local:TubeTemplateSelector> <DataTemplate x:Key="TubeTemplate" x:DataType="data:Tube"> <local:TubeTemplate HorizontalAlignment="Stretch" VerticalAlignment="Stretch" FavoritesNumber="{x:Bind SpaceLength, Mode=OneWay}"></local:TubeTemplate> </DataTemplate>
在
TubeTemplate
我有一个按钮的内部,在其他视图旁边:<Button Name="RemoveTube" Click="RemoveTube_Click" <Image Source="../Assets/xIcon.png" Stretch="None"> </Image> </Button>
我想要达到的目标:
- 当我单击时,
ListViewItem
我希望ItemClick
触发事件。这行得通。 - 但是当我点击里面的按钮时,
ListViewItem
我希望在主页内触发一个不同的事件。
- 当我单击时,
这个想法是单击一个项目以选择它,但是当我单击项目内的按钮时,我希望删除该项目。
我有哪些选择?
解决方案
如果看起来是在不使用视图模型的情况下执行此操作,那么您可以向 TubeTemplate 控件添加一个事件。
public event EventHandler Closed;
单击关闭按钮时,您将触发该事件。
private void RemoveTube_Click(object sender, RoutedEventArgs e)
{
Closed?.Invoke(this, EventArgs.Empty); // Even better would be to give the item clicked (the data context)
}
然后,您可以在 MainPage 中订阅该事件。
<local:TubeTemplate HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
Closed="TubeTemplate_Closed">
</local:TubeTemplate>
在该TubeTemplate_Closed
方法中,您可以删除单击的项目。
private void TubeTemplate_Closed(object sender, EventArgs e)
{
var element = (FrameworkElement)sender;
var tube = (Tube)element.DataContext;
TubeItems.Remove(tube);
}