我正在Xamarin.Forms页面上工作,该页面显示使用MVVM模式的项目列表。
我无法获得工作的列表项的TapGestureRecognizer对象的Command属性。无论我尝试什么,它都不会开火。 对于所有的listview元素,此命令属性应引用VM上的单个ICommand属性。 CommandParameter属性应根据其ID在元素之间进行选择。
点击事件似乎正在运行。我不确定Command属性与VM的数据绑定是否错误或Xamarin.Forms在此处是否存在错误。
我曾尝试过将TapGestureRecognizer的Command属性绑定到ViewModel的数据的其他设置,并且还在嵌套View元素上使用了InputTransparent属性。这里没有变化:命令不会触发
查看XAML标头:
<ContentPage ...
x:Class="Ch9.MainPage2"
x:Name="page"
>
视图具有ViewModel属性,即viewmodel:
public partial class MainPage2 : ContentPage
{
public MainPage2ViewModel ViewModel
{
get => BindingContext as MainPage2ViewModel;
set => BindingContext = value;
}
public MainPage2()
{
InitializeComponent();
ViewModel = new MainPage2ViewModel(
...injecting components...
);
}
}
viewmodel具有ItemTappedCommand属性:
public ICommand ItemTappedCommand { get; private set; }
...
ItemTappedCommand = new Command<int>(async id => await OnItemTappedCommand(id));
在页面内部,我具有一个stacklayout作为content-root,并且在stacklayout内部有一个listview。为了使代码小,我省略了我认为不相关的
<ListView
ItemsSource="{Binding SearchResults}">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<StackLayout>
<StackLayout.GestureRecognizers>
<TapGestureRecognizer
BindingContext="{x:Reference page}"
Command="{Binding Path=ViewModel.ItemTappedCommand}" CommandParameter="{Binding Id}" NumberOfTapsRequired="1"/>
</StackLayout.GestureRecognizers>
<Image InputTransparent="True">
<Image.Source>
<UriImageSource Uri="{Binding ImgSmSrc}"
CacheValidity="0"
CachingEnabled="False"
/>
</Image.Source>
</Image>
<StackLayout InputTransparent="True">
some content...
</StackLayout>
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
答案 0 :(得分:0)
您已将TapGestureRecognizer
的{{1}}更改为当前内容页面,但是它无法注意到自定义的已定义属性BindingContext
,只能使用ViewModel
的财产。
因此ContentPage
此绑定将失败。
我建议您像这样调整绑定力:
{Binding Path=ViewModel.ItemTappedCommand}
<ListView x:Name="listView" ItemsSource="{Binding SearchResults}" HasUnevenRows="True">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<StackLayout>
<StackLayout.GestureRecognizers>
<TapGestureRecognizer Command="{Binding Path= BindingContext.ItemTappedCommand, Source={x:Reference listView}}"
CommandParameter="{Binding Id}"
NumberOfTapsRequired="1"/>
</StackLayout.GestureRecognizers>
<!--onther stuff-->
<!--...-->
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
的绑定上下文是您的视图模型,已使用后面的代码进行设置。最后,您可以在那里消费listView
。
此外,当您要访问ID时,我只更改了ItemTappedCommand
的{{1}}而不是整个手势的绑定上下文。否则,您将不会检索它,因为它属于Command
的元素,而不是查看模型本身。