我可以使用C#代码添加对命令的调用而不是<grid.gesturerecognizers>吗?

时间:2017-07-28 06:36:31

标签: xamarin xamarin.forms

我有这段代码:

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

1 个答案:

答案 0 :(得分:6)

GestureRecognizer添加到ViewCell是一个很大的禁忌。 ListView或TableView中存在ViewCell,它们拥有足够多的自己的选项。添加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 - Tapped命令

使用MVVM时,您不希望在页面的代码隐藏中添加大量业务逻辑。在这种情况下,您可以使用Behavior将事件转换为命令。可以在这里找到一个样本:

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

<强> 6。 ListView - ItemSelected

ListView本身也有ItemSelected个事件。这可以采用与ViewCell Tapped事件相同的方式处理,其中包含代码隐藏事件或Behavior事件,以将其委托给Command

<强> 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
    }
}