单元格中按钮的Xamarin Telerik ListView - 按钮的点击事件不会被激活

时间:2017-10-04 13:42:34

标签: c# xaml xamarin.forms telerik

我正在使用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事件......任何人都可以帮助我在这种情况下如何使按钮可点击?

1 个答案:

答案 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 );
  }
}

这样,在我的视图模型属性中设置值就像事件一样......在这种情况下,我可以避免为列表项抽头设置事件处理程序...同时仍然获得正常的选择行为...和项目上的按钮也是如此。