2017-10-04 33 views
1

我正在用Telerik RadListView組件構建一個Xamarin Forms頁面。 ListView的ItemTapped事件工作正常,但是當我將一個按鈕添加到ListViewTemplateCell.View時,按鈕的Clicked事件不會觸發。Xamarin Telerik ListView與單元格中按鈕的按鈕的點擊事件不會觸發

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事件被覆蓋的按鈕被點擊的事件......誰能與我怎樣才能使按鈕幫助在這種情況下可點擊嗎?

+0

pass CommandParameter value –

回答

0

我有一個頁面,它與您的設置稍有不同,我在列表項上找到無法使用的按鈕。這可能只是因爲您發佈後控件已經更新和修復,或者它可能是我設置列表的不同之處。 (我認爲自從你發佈以來,至少有3個更新的telerik xamarin控件)

一個快速的嘗試......使SelectionMode="None",並採取輕拍的處理程序...看看你的按鈕,然後工作。如果這樣做,你可以在整個列表項目的網格(透明,無文本按鈕或類似的東西)下創建一個可點擊區域......然後在網格中放置按鈕(這將按照更高的z順序) 。

在我的情況下,我沒有一個項目挖掘處理程序。相反,我綁定SelectedItem兩路視圖模型屬性......這樣,當所選項目的變化,我通知:

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

在我的基地視圖模型,我的基礎屬性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允許在屬性實際更改時注入方法來調用。

...等「典型」視圖模型屬性是這樣的(這是項目源):

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

這樣一來,在我看來模特屬性設置值是事件性的,我還可以,在這種情況下, ,避免有一個事件處理程序的列表項目水龍頭......同時仍然得到正常的選擇行爲......以及項目上的按鈕。

相關問題