我正在尝试在Xml中绑定一个手势识别器,以便我可以在单击一个项目时进行处理
我尝试将此用于我的XML
<DataTemplate x:Key="TextPostTemplate">
<ViewCell>
<StackLayout BackgroundColor="White" Margin="10, 10, 10, 10" Padding="10, 10, 10, 10">
<StackLayout Orientation="Horizontal">
<Label Text="{Binding Name}" TextColor = "Black" FontSize = "15"/>
<Image Source="options_icon.png" HeightRequest="15" HorizontalOptions="EndAndExpand" Margin="0, 0, 10, 0">
<Image.GestureRecognizers>
<TapGestureRecognizer Tapped="{Binding OptionClick}"/>
</Image.GestureRecognizers>
</Image>
</StackLayout>
<Label Text="{Binding Body}" TextColor = "Black"/>
</StackLayout>
</ViewCell>
</DataTemplate>
我尝试将其绑定到
foreach (var post in posts)
{
TapGestureRecognizer optionsClick = new TapGestureRecognizer();
optionsClick.Tapped += (s, e) =>
{
ShowPostOptions(page, navigation, post.id, post.user);
};
}
和...
OptionClick = optionsClick
但是我得到了
.xaml:error:无法将类型为'Xamarin.Forms.Xaml.ElementNode'的对象强制转换为'Xamarin.Forms.Xaml.ValueNode'。
答案 0 :(得分:2)
你正试图将一个事件绑定到一个命令,然后看起来又回来了,它只是不起作用
<TapGestureRecognizer Tapped="{Binding OptionClick}"/>
如果视图模型中有ICommand,则可以执行此操作
<TapGestureRecognizer Command="{Binding TapCommand}" ...
如果你有一个事件准备进入代码,你可以这样做
public void OnTapGestureRecognizerTappedEvet(Object sender,EventArgs e)
{
// code here
}
<TapGestureRecognizer Tapped="OnTapGestureRecognizerTappedEvet" ...
如果您想在代码中完成所有操作
var tapGestureRecognizer = new TapGestureRecognizer();
tapGestureRecognizer.Tapped += (s, e) => {
// handle the tap
};
image.GestureRecognizers.Add(tapGestureRecognizer);
答案 1 :(得分:2)
您的代码无效,因为您有效地将TapGestureRecognizer
的实例绑定到Tapped
事件。您不能对事件进行数据绑定,如果您要设置它,则可以将其设置为事件处理程序而不是TapGestureRecognizer
本身的实例。
您有两种选择 - 事件处理程序或命令。
在XAML中声明手势识别器,如下所示:
<TapGestureRecognizer Tapped="TappedHandler" />
在页面的代码隐藏中创建一个名为TappedHandler
的事件处理程序:
public void TappedHandler(object sender, EventArgs e)
{
ShowPostOptions(page, navigation, post.id, post.user);
}
在XAML中声明手势识别器,如下所示:
<TapGestureRecognizer Command="{Binding TapCommand}" />
在视图模型中创建一个可以处理点击的命令:
private ICommand _tapCommand;
public ICommand TapCommand => _tapCommand ??
( _tapCommand = new Command(
() => ShowPostOptions(page, navigation, post.id, post.user) ) );