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

时间:2019-03-04 11:27:05

标签: xamarin xamarin.android

我修复了自定义某些项目中的一些问题 其中之一,我需要在分隔的类和文件中使用自定义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}传递给相同的结果,或者使该命令进行交互

1 个答案:

答案 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是一个不同的类,您不能从中简单地访问其他一些类的字段。 ArticleItemViewCellmArt一无所知。尽管可能以某种方式访问​​父级,但我建议您不要这样做,因为您往往会忘记这些详细信息,几个月后,您将查看您的视图并想知道直到您意识到,该单元执行了一些可疑的事情之前,都与该单元进行了交互。这只会花费您时间。去过也做过。相信我。

而是在视图单元中创建类型为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)一起使用将更具表现力,并为您省去了其他命令