单元格中带有按钮的 Xamarin Telerik ListView - 按钮的单击事件不会触发

Posted

技术标签:

【中文标题】单元格中带有按钮的 Xamarin Telerik ListView - 按钮的单击事件不会触发【英文标题】:Xamarin Telerik ListView with Button in the cell - button's clicked event won't fire 【发布时间】:2018-03-15 22:37:36 【问题描述】:

我正在构建一个带有 Telerik RadListView 组件的 Xamarin 表单页面。 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 事件...谁能帮助我在这种情况下如何使按钮可点击?

【问题讨论】:

传递命令参数值 【参考方案1】:

我的页面设置与您的稍有不同,并且列表项上的按钮可以正常工作而不会出现问题。可能只是自您发布以来控件已更新和修复,或者可能是我设置列表的方式不同。 (我认为自从您发布以来,telerik xamarin 控件至少有 3 次更新)

一个快速的尝试...制作SelectionMode="None" 并取下点击的处理程序...看看您的按钮是否可以工作。如果可行,您可以在整个列表项的网格下创建一个可点击区域(透明、无文本按钮或类似的东西)......然后将按钮放在网格中(这将是更高的 z 顺序) .

在我的例子中,我没有一个item taped handler。相反,我将SelectedItem 双向绑定到视图模型属性...这样,当所选项目更改时,我会收到通知:

        <telerikDataControls:RadListView ItemsSource="Binding Path=SelectedItems"
                                         SelectionMode="Single"
                                         SelectedItem="Binding Path=SelectedItem,Mode=TwoWay"
                                         VerticalOptions="FillAndExpand">

在我的基础 ViewModel 中,我的基础属性设置器如下所示:

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 允许注入在属性实际更改时调用的方法。

...所以一个“典型的”视图模型属性是这样的(这是项目源):

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 );
  

这样,在我的视图模型属性中设置值类似于事件......在这种情况下,我可以避免使用列表项点击的事件处理程序......同时仍然获得正常的选择行为......并且项目上的按钮也是如此。

【讨论】:

以上是关于单元格中带有按钮的 Xamarin Telerik ListView - 按钮的单击事件不会触发的主要内容,如果未能解决你的问题,请参考以下文章

如何在xamarin中删除集合视图中的一个单元格和sqlite中的行的删除按钮?

解析和斯威夫特。获取 UITableView 中带有复选标记的单元格。 “不能调用参数。”

Xamarin iOS - MVVMCross:无法使用 ViewModel 中的命令连接自定义单元格中的按钮

在 Xamarin IOS 的 UITableview 中更改滑动以删除按钮高度

原型单元格中带有 CollectionView 的动态 TableView

在uitableview中带有空格填充的圆形单元格