我修复了一些项目中的一些问题,我需要在Separated类和文件中使用自定义ViewCell
:
<?xml version="1.0" encoding="UTF-8"?>
<ViewCell xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="HBRS.Controls.ViewCellTemplates.ArticleItemViewCell">
<Image>
<Image.GestureRecognizers>
<TapGestureRecognizer
Command="{Binding BindingContext.clickCommand, Source={x:Reference Name=mArt}}"
CommandParameter="{Binding .}" />
</Image.GestureRecognizers>
</Image>
</ViewCell>
其中mArt
是一个视图,它会命令用它制作一些东西
之后我在我的xamarin
页面中使用了这个视图单元格:
<ListView.ItemTemplate>
<DataTemplate>
<Cell:ArticleItemViewCell />
</DataTemplate>
</ListView.ItemTemplate>
当我在我的设备上运行应用程序时,它会抛出一个异常,说找不到'mArt'引用的对象,所以我需要一些方法来传递Source={x:Reference Name=mArt}
并使用相同的结果或者使用该命令进行交互
根据你的写作,我假设你有一个使用你的ViewCell
的视图
<ContentView ...
x:Name="mArt">
<ListView ...>
<ListView.ItemTemplate>
<DataTemplate>
<templates:ArticleItemViewCell ... />
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</ContentView>
现在你试图从你的mArt
引用那个视图ViewCell
。不幸的是,事情并非如此。 mArt
不是全局变量,而是视图类的成员(如果您对细节感兴趣,请查看在对象文件夹中创建的.xaml.g.cs
文件)。
然而,ArticleItemViewCell
是一个不同的类,你不能简单地访问其他类的字段。 ArticleItemViewCell
对mArt
一无所知。虽然有可能以某种方式访问父母,但我建议你不要,因为你倾向于忘记这些细节,几个月后你会看到你的观点,并想知道与细胞的互动在哪里实施,直到你意识到,细胞做了一些鱼腥味的东西。这只会花费你的时间。去过也做过。相信我。
而是在viewcell中创建Command
类型的可绑定属性,并从包含视图绑定到该属性
在ArticleItemViewCell.xaml.cs中
public static readonly BindableProperty TappedCommandProperty = BindableProperty.Create(nameof(TappedCommand), typeof(Command), typeof(ArticleItemViewCell));
public Command TappedCommand
{
get => (Command)GetValue(TappedCommandProperty);
set => SetValue(TappedCommandProperty, value);
}
现在你可以从你的ArticleItemViewCell
绑定它们
<ViewCell xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="HBRS.Controls.ViewCellTemplates.ArticleItemViewCell"
x:Name="Cell">
<Image>
<Image.GestureRecognizers>
<TapGestureRecognizer
Command="{Binding TappedCommand, Source={x:Reference Cell}}"
CommandParameter="{Binding .}" />
</Image.GestureRecognizers>
</Image>
</ViewCell>
从您的角度来看,您可以绑定VM的clickCommand
<ContentView ...
x:Name="mArt">
<ListView ...>
<ListView.ItemTemplate>
<DataTemplate>
<templates:ArticleItemViewCell TappedCommand="{Binding Source={x:Reference mArt}, Path=BindingContext.clickCommand}" ... />
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</ContentView>
我没有尝试确切的代码,但基本上这个工作。
请注意:将ItemTapped
事件(see the docs)与事件命令行为(see here)一起使用会更具表现力,并为您提供额外的命令。