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

Sam*_*tar 0 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>
Run Code Online (Sandbox Code Playgroud)

有没有办法在C#中将命令连接到单元格的敲击而不是必须使用XAML <Grid.GestureRecognizers>

Ste*_*sen 6

添加GestureRecognizer到a ViewCell是一个很大的禁忌.一个ViewCell一个ListView或TableView中有自己的够多了窃听选项中存在.添加一个GestureRecognizer可能会混淆操作系统应该处理哪个点击.

你的选择GestureRecognizer基本上是以下3,但我建议在你有ListView/ 的情况下反对他们TableView.

查看我在下面提到的一些基于ListView/ViewCell的替代方案.


1. GestureRecognizer - 在代码中添加它

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

2. GestureRecognizer - 使用命令

使用MVVM时,您还可以在C#中使用命令绑定:

var tapGestureRecognizer = new TapGestureRecognizer();
tapGestureRecognizer.SetBinding (TapGestureRecognizer.CommandProperty, "TapCommand");
myGrid.GestureRecognizers.Add(tapGestureRecognizer);
Run Code Online (Sandbox Code Playgroud)

然后可以绑定在XAML中:

<Grid>
    <Grid.GestureRecognizers>
        <TapGestureRecognizer Command="{Binding TapCommand}" />
    </Grid.GestureRecognizers>
</Grid>
Run Code Online (Sandbox Code Playgroud)

3. GestureRecognizer - 像你一样在XAML中添加它

<Grid>
      <Grid.GestureRecognizers>
         <TapGestureRecognizer Command="{Binding OpenPickerCommand}" CommandParameter="{x:Reference coPicker}" NumberOfTapsRequired="1" />
      </Grid.GestureRecognizers>
</Grid>
Run Code Online (Sandbox Code Playgroud)

4. ViewCell - Tapped事件

因为ViewCell你有一个Tapped事件:

<ViewCell Height="100" Tapped="OnTapped">
    <ViewCell.View>
        <StackLayout BackgroundColor="White" >
        </StackLayout>
    </ViewCell.View>
</ViewCell>
Run Code Online (Sandbox Code Playgroud)

您可以在代码隐藏中实现:

void OnTapped (object sender, System.EventArgs e) { //your code}
Run Code Online (Sandbox Code Playgroud)

5. ViewCell - Tapped命令

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

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


6. ListView - ItemSelected

ListView本身也有一个ItemSelected事件.这可以通过ViewCell Tapped与代码隐藏中的事件或将Behavior其委托给a 的事件相同的方式处理Command.

7. ListView - SelectedItem属性

您可以将SelectedItem视图模型中的属性绑定到该属性.在setter上,您可以执行自定义代码.

<ListView
    ItemsSource="{Binding YourItems}"
    SelectedItem="{Binding YourSelectedItem, Mode=TwoWay}" >
</ListView>
Run Code Online (Sandbox Code Playgroud)

在代码中:

string _yourSelectedItem;
public string YourSelectedItem
{
    get { return _yourSelectedItem; }
    set {
        _yourSelectedItem = value;
        // Perform your custom functionality
    }
}
Run Code Online (Sandbox Code Playgroud)