2017-07-28 28 views
1

我有這樣的代碼:我可以使用C#代碼將調用添加到命令而不是<Grid.GestureRecognizers>嗎?

<ViewCell x:Name="co"> 
    <Grid VerticalOptions="CenterAndExpand" Padding="20, 0"> 
     <Grid.GestureRecognizers> 
     <TapGestureRecognizer Command="{Binding OpenPickerCommand}" CommandParameter="{x:Reference coPicker}" NumberOfTapsRequired="1" /> 
     </Grid.GestureRecognizers> 
     <Picker x:Name="coPicker" IsVisible="false" HorizontalOptions="End" SelectedIndexChanged="coPickerSelectedIndexChanged" ItemsSource="{Binding Order}"></Picker> 
     <Label x:Name="coLabel" HorizontalOptions="End"/> 
    </Grid> 
</ViewCell> 

有沒有一種方法,我可以在C#中的命令連接到小區的攻,而不是必須使用XAML <Grid.GestureRecognizers>

回答

6

GestureRecognizer添加到ViewCell是一個很大的禁忌。在ListView或TableView中存在一個ViewCell,它們擁有足夠多的自己的tapper選項。添加GestureRecognizer可能會讓操作系統感到困惑,因爲它應該處理哪個點擊。

您的GestureRecognizer選項基本上是以下3個,但是我建議對他們在這樣一個場景,你有一個ListView/TableView

看看我在下面提到的一些基於ListView/ViewCell的替代方案。


1 GestureRecognizer - 加入它代碼

var tapGestureRecognizer = new TapGestureRecognizer(); 
tapGestureRecognizer.Tapped += (s, e) => { 
    // handle the tap 
}; 
myGrid.GestureRecognizers.Add(tapGestureRecognizer); 

2. GestureRecognizer - 使用命令

當您使用MVVM你也可以使用一個命令在C#結合:

var tapGestureRecognizer = new TapGestureRecognizer(); 
tapGestureRecognizer.SetBinding (TapGestureRecognizer.CommandProperty, "TapCommand"); 
myGrid.GestureRecognizers.Add(tapGestureRecognizer); 

然後可以在XAML綁定:

<Grid> 
    <Grid.GestureRecognizers> 
     <TapGestureRecognizer Command="{Binding TapCommand}" /> 
    </Grid.GestureRecognizers> 
</Grid> 

3 GestureRecognizer - 它添加在XAML爲你做了

<Grid> 
     <Grid.GestureRecognizers> 
     <TapGestureRecognizer Command="{Binding OpenPickerCommand}" CommandParameter="{x:Reference coPicker}" NumberOfTapsRequired="1" /> 
     </Grid.GestureRecognizers> 
</Grid> 

4. ViewCell - 螺紋事件

對於ViewCell你有一個Tapped事件:

<ViewCell Height="100" Tapped="OnTapped"> 
    <ViewCell.View> 
     <StackLayout BackgroundColor="White" > 
     </StackLayout> 
    </ViewCell.View> 
</ViewCell> 

,你可以在後臺代碼實現:

void OnTapped (object sender, System.EventArgs e) { //your code} 

5. ViewCell - 螺紋命令

當使用MVVM你不想把大量的業務邏輯在您的頁面的代碼隱藏。在這種情況下,您可以使用Behavior將事件轉換爲命令。這方面的一個樣本可以在這裏找到:

https://github.com/xamarin/xamarin-forms-samples/tree/master/Behaviors/EventToCommandBehavior/EventToCommandBehavior


6。ListView - 商品已選

ListView本身也有一個ItemSelected事件。這可以以與代碼隱藏事件或Behavior中事件代理Command事件相同的方式處理,如ViewCellTapped事件。

7. ListView控件 - SelectedItem屬性

可以綁定SelectedItem一個屬性在您的視圖模型。在setter上,您可以執行自定義代碼。

<ListView 
    ItemsSource="{Binding YourItems}" 
    SelectedItem="{Binding YourSelectedItem, Mode=TwoWay}" > 
</ListView> 

而在代碼:

string _yourSelectedItem; 
public string YourSelectedItem 
{ 
    get { return _yourSelectedItem; } 
    set { 
     _yourSelectedItem = value; 
     // Perform your custom functionality 
    } 
} 
+0

謝謝您非常詳細的解答。我很欣賞你對這些建議的所有努力。基於你的回答,我想可能對我來說最容易實現的就是使用Tapped事件。在我的情況下,我使用一個選擇器,因此我現在會開放一個新的問題,因爲我不太確定如何使用onTapped來實現這個問題。謝謝 –

相關問題