我正在使用Telerik radlistview组件构建Xamarin表单页面。ListView的Itemtapped事件可以正常工作,但是当我在ListViewTemplatecell.view中添加一个按钮时,该按钮的单击事件不会触发。
xaml:
<telerikDataControls:RadListView x:Name="listView" ItemsSource="{Binding ListSource, Mode=TwoWay}" SelectionMode="Single" ItemTapped="List_Tapped">
<telerikDataControls:RadListView.ItemTemplate>
<DataTemplate>
<telerikListView:ListViewTemplateCell>
<telerikListView:ListViewTemplateCell.View>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="2*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Label Margin="10" Text="{Binding itemName}" Grid.Row="0" Grid.Column="0" />
<Button Text="Button" BackgroundColor="Blue" Clicked="Button_Clicked" Grid.Row="0" Grid.Column="1" Margin="0,0,30,0" HorizontalOptions="EndAndExpand" VerticalOptions="Center" />
</Grid>
</telerikListView:ListViewTemplateCell.View>
</telerikListView:ListViewTemplateCell>
</DataTemplate>
</telerikDataControls:RadListView.ItemTemplate>
</telerikDataControls:RadListView>
代码背后:
private void List_Tapped(object sender,
Telerik.XamarinForms.DataControls.ListView.ItemTapEventArgs e)
{
Debug.WriteLine("List item tapped");
}
private void Button_Clicked(object sender, EventArgs e)
{
Debug.WriteLine("Button clicked");
DisplayAlert("Alert", "Button was clicked", "OK");
}
我假设ListView的Itemtapped事件正在覆盖按钮的点击事件...任何人可以帮助我如何在这种情况下单击按钮?
我有一个与您的页面有所不同的页面,并且我在列表项目上获得了可工作的按钮。自您发布以来,可能已经对控件进行了更新和修复,也可能是我设置列表的方式的区别。(我认为自发布以来,Telerik Xamarin控件至少有3个更新)
一件快速的尝试...制作SelectionMode="None"
并取下敲击的处理程序...然后查看您的按钮是否有效。如果有效,您可以在整个列表项目的网格(透明,无文本按钮或类似的内容)下进行可轻松的区域...然后将按钮放在网格中(将处于较高的Z-order)。
就我而言,我没有一个点击的处理程序。取而代之的是,我将SelectedItem
双向绑定到视图模型属性...当所选项目更改时,我已通知:
<telerikDataControls:RadListView ItemsSource="{Binding Path=SelectedItems}"
SelectionMode="Single"
SelectedItem="{Binding Path=SelectedItem,Mode=TwoWay}"
VerticalOptions="FillAndExpand">
在我的基本视图模型中,我的基本属性设置器如下:
protected bool SetProperty<T>( ref T existing, T value, Action whenChanged = null, [CallerMemberName]string propertyName = "" )
{
if ( EqualityComparer<T>.Default.Equals( existing, value ) ) return false;
existing = value;
whenChanged?.Invoke( );
OnPropertyChanged( propertyName );
return true;
}
请注意,设置器允许在属性实际更改时注入一种方法。
...因此,"典型"视图模型属性如下(这是项目源):
ObservableCollection<T> selectedItems;
public ObservableCollection<T> SelectedItems
{
get { return selectedItems; }
set { SetProperty( ref selectedItems, value ); }
}
...但是,如果我有代码在属性更改时可以执行此操作,我可以执行此操作(这是绑定到SelectedItem双向的属性):
T selectedItem;
public T SelectedItem
{
get { return selectedItem; }
set { SetProperty( ref selectedItem, value, MaybeSelectItem ); }
}
void MaybeSelectItem( )
{
if ( SelectItem.CanExecute( null ) )
{
SelectItem.Execute( null );
}
}
以这种方式,在我的视图模型属性中设置值类似于事件……而且在这种情况下,我可以避免使用列表项目的事件处理程序...同时仍然获得正常的选择行为...和项目上的按钮。