我修复了自定义某些项目中的一些问题
其中之一,我需要在分隔的类和文件中使用自定义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}
传递给相同的结果,或者使该命令进行交互
答案 0 :(得分:0)
根据您的撰写,我假设您使用ViewCell
之类的视图
<ContentView ...
x:Name="mArt">
<ListView ...>
<ListView.ItemTemplate>
<DataTemplate>
<templates:ArticleItemViewCell ... />
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</ContentView>
现在您正在尝试从mArt
引用该视图ViewCell
。不幸的是,事情并非如此。 mArt
不是全局变量,而是视图类的成员(如果您对详细信息感兴趣,请查看在对象文件夹中创建的.xaml.g.cs
文件)。 / p>
ArticleItemViewCell
是一个不同的类,您不能从中简单地访问其他一些类的字段。 ArticleItemViewCell
对mArt
一无所知。尽管可能以某种方式访问父级,但我建议您不要这样做,因为您往往会忘记这些详细信息,几个月后,您将查看您的视图并想知道直到您意识到,该单元执行了一些可疑的事情之前,都与该单元进行了交互。这只会花费您时间。去过也做过。相信我。
而是在视图单元中创建类型为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>
从您的角度来看,您可以绑定虚拟机的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)一起使用将更具表现力,并为您省去了其他命令