我有这段代码:
<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>
?
答案 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
将事件转换为命令。可以在这里找到一个样本:
<强> 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
}
}