我正在使用Telerik RadListView组件构建Xamarin Forms页面。 listview的ItemTapped事件工作正常,但当我在ListViewTemplateCell.View中添加一个按钮时,Button的Clicked事件不会触发。
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事件覆盖了Button的Clicked事件......任何人都可以帮助我在这种情况下如何使按钮可点击?
答案 0 :(得分:0)
我的页面设置与您的页面略有不同,我在列表项目上获得了无问题的按钮。可能只是因为您发布了控件已更新并修复,或者可能与我设置列表的方式不同。 (我认为自你发布以来至少有3次对telerik xamarin控件的更新)
快速尝试一下......制作SelectionMode="None"
并关闭tapped处理程序...看看你的按钮是否正常工作。如果可行,您可以在整个列表项的网格下创建一个可点击区域(透明,无文本按钮或类似的东西)...然后将按钮放在网格中(将在更高的位置) z顺序)。
在我的情况下,我没有项目点击处理程序。相反,我将SelectedItem
双向绑定到视图模型属性...这样当所选项目发生更改时,我已通知:
<telerikDataControls:RadListView ItemsSource="{Binding Path=SelectedItems}"
SelectionMode="Single"
SelectedItem="{Binding Path=SelectedItem,Mode=TwoWay}"
VerticalOptions="FillAndExpand">
在我的基础ViewModel中,我的基本属性setter如下:
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;
}
请注意,setter允许在属性实际更改时注入要调用的方法。
......等等#34;典型的&#34; view model属性是这样的(这是项目源):
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 );
}
}
这样,在我的视图模型属性中设置值就像事件一样......在这种情况下,我可以避免为列表项抽头设置事件处理程序...同时仍然获得正常的选择行为...和项目上的按钮也是如此。