2017-07-28 29 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来实现这个问题。谢谢 –

相关问题