【问题标题】:Xamarin Forms List View: Add Command to List ItemXamarin 表单列表视图:将命令添加到列表项
【发布时间】:2018-06-04 10:53:51
【问题描述】:

注意:这适用于 Xamarin 表单。被认为是重复的问题是实际处理 C# ListView

我有一个列表视图(跨平台使用 Visual Studio 2017 for Mac Xamarin Forms)我对数据绑定有一个粗略的了解,因此我获得了从 Web 服务加载数据的表单。现在我想为每个显示的行执行一些操作,所以我在 ListView 中为每个项目嵌入了一个按钮。我不知道如何添加一个动作,以便它为选中的那一行执行一些功能。

在 ListView 中,我以这种方式创建按钮:

<Button x:Name="prayUpButton" Command="{Binding _handle_prayupbutton_action}" Text="PU" Grid.Row="4" Grid.Column="0" />

在后面的代码中我有以下方法:

void handle_prayupbutton_action()
{

}

public Command _handle_prayupbutton_action
{    
        get { return new Command(() => handle_prayupbutton_action());
}

据我了解,您创建了一个Command,然后将触发该操作。我在这里想念什么?如果我在void handle_prayupbutton_action() 上设置断点,它永远不会命中它。

将操作添加到 Xamarin Forms 跨平台列表视图的最佳做法/正确方法是什么?

更新 1:我将下面的代码更改为:

这是我的标题:

<?xml version="1.0" encoding="UTF-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="prayupapp.Pages.PrayersPage" x:Name="PrayersPagePage">

所以我改变了按钮命令:

<Button x:Name="prayUpButton" Command="{Binding Source={x:Static local.PrayersPagePage._handle_prayupbutton_action}}" Text="Pray Up" Grid.Row="4" Grid.Column="0" />

我还按照 Julipan 的建议将命令例程设为静态。我实际上正在倒退,因为列表视图现在停止从上一页加载。我发现如果我将按钮命令返回到它的原始代码(这显然是错误的)它确实有效。我进行绑定的方式有问题。

【问题讨论】:

  • 当你说后面的代码时,你只是指 Xaml.cs 文件吗?要使用绑定,您必须将视图的 BindingContext 设置为不同的类(ViewModel)并将命令放在那里。 developer.xamarin.com/guides/xamarin-forms/xaml/xaml-basics/… 涵盖了大部分内容
  • 您是否将绑定上下文设置为 ListView 或 Page?项目的 BindingContext,就是项目本身。因此,当您在项目单元格内使用绑定时,绑定属性必须可在项目级别访问。你明白吗?
  • @GeraldVersluis 与 IS 相关的问题专门关于 XF
  • 不太了解您的编辑。就像@Jason 所说,我所指的副本 is 用于 Xamarin.Forms。 ListView 是 Xamarin.Forms 特定的控件。如果你仔细观察,你会发现解决方案是一样的。请注意,ListView 中的每个项目都未绑定到视图模型或代码隐藏,而是引用 ListView Cell 中显示的实例。这就是为什么您的Command 没有被解雇的原因。它正在查看Cell 中表示的类。请再看一下,或解释它有何不同。

标签: button xamarin.forms cross-platform action


【解决方案1】:

如果您需要做的只是将代码隐藏的命令绑定到按钮的命令属性,那么您需要在“代码隐藏”中将命令定义为静态:

static void handle_prayupbutton_action()
{

}

public static Command _handle_prayupbutton_action
{
    get
    {
        return new Command(() => handle_prayupbutton_action());
    }
}

在您的 XAML 中,您必须添加要绑定到的源:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         xmlns:local="clr-namespace:AppX"
         x:Class="AppX.MainPage">

    <StackLayout>
        <ListView ItemsSource="{Binding Source={x:Static local:MainPage.Items},
                                        Path=.}">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <StackLayout>
                            <Button Text="{Binding .}"
                                    Command="{Binding Source={x:Static local:MainPage._handle_prayupbutton_action}}"/>
                        </StackLayout>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </StackLayout>
</ContentPage>

这对我来说非常有效。我希望你得到你正在寻找的知识。

【讨论】:

  • 我用更新的代码更新了这个问题。仍然不适合我:(
  • 当心!您现在将“源”设置为“本地”,但此变量未在 XAML 中定义,就像我在示例中所做的那样(它只是指命令所在的命名空间)。如果您正在处理“代码隐藏”上的事件,请改用“点击”。命令适用于使用 MVVM 架构时。如果您决定使用“Clicked”,请忘记命令并注意根本不需要绑定,因为您只是在后面的代码中引用处理程序:
  • 我想你刚刚解决了我的问题......我终于可以抛出一个点击事件。不知道为什么我过去无法让它工作。我只需要测试一些东西,我认为你应该得到公认的答案!
猜你喜欢
  • 1970-01-01
  • 2020-09-10
  • 1970-01-01
  • 1970-01-01
  • 2020-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-13
相关资源
最近更新 更多