自定义ViewCell包含按钮具有命令并绑定到此命令

问题描述 投票:0回答:1

我修复了一些项目中的一些问题,我需要在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}并使用相同的结果或者使用该命令进行交互

xamarin xamarin.android
1个回答
1
投票

根据你的写作,我假设你有一个使用你的ViewCell的视图

<ContentView ...
    x:Name="mArt">
    <ListView ...>
        <ListView.ItemTemplate>
            <DataTemplate>
                <templates:ArticleItemViewCell ... />
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</ContentView>

现在你试图从你的mArt引用那个视图ViewCell。不幸的是,事情并非如此。 mArt不是全局变量,而是视图类的成员(如果您对细节感兴趣,请查看在对象文件夹中创建的.xaml.g.cs文件)。

然而,ArticleItemViewCell是一个不同的类,你不能简单地访问其他类的字段。 ArticleItemViewCellmArt一无所知。虽然有可能以某种方式访问​​父母,但我建议你不要,因为你倾向于忘记这些细节,几个月后你会看到你的观点,并想知道与细胞的互动在哪里实施,直到你意识到,细胞做了一些鱼腥味的东西。这只会花费你的时间。去过也做过。相信我。

而是在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)一起使用会更具表现力,并为您提供额外的命令。

© www.soinside.com 2019 - 2024. All rights reserved.