绑定ToolbarItem单击Xamarin.Forms

时间:2016-03-26 10:12:34

标签: c# xamarin xamarin.forms

我正在尝试使用Xamarin.Forms构建我的第一个简单应用程序。

在这个应用程序中,我有一个带有ListView和工具栏的ContentPage(在NavigationPage中)。

工具栏有一个ToolbarItem,它应该在单击时运行一个方法。即使我已经搜索过Google,我也无法让它发挥作用......

有人可以告诉我我错过了什么吗?

XAML:

<?xml version="1.0" encoding="UTF-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:constants="clr-namespace:FlashCards;assembly=FlashCards"
x:Class="FlashCards.SetsPage" 
Title="Card Sets">
    <ContentPage.ToolbarItems>
          <ToolbarItem Name="Add" Icon="Icon-Button-Add.png" Command="{Binding CreateCommand}"></ToolbarItem>
    </ContentPage.ToolbarItems>
  <ListView x:Name="CardSetView">
    <ListView.ItemTemplate>
      <DataTemplate>
        <TextCell Text="{Binding Title}" />
      </DataTemplate>
    </ListView.ItemTemplate>
  </ListView>
</ContentPage>

代码隐藏:

//...
public partial class SetsPage : ContentPage
    {
        ObservableCollection<CardSet> sets = new ObservableCollection<CardSet>();

        public Command CreateCommand { get; private set; }

        public SetsPage() {

            InitializeComponent();

            sets.Add(new CardSet{ Title = "Test 1" });
            sets.Add(new CardSet{ Title = "Test 2" });
            sets.Add(new CardSet{ Title = "Test 3" });

            CardSetView.ItemsSource = sets;

            this.CreateCommand = new Command(async (sender) =>
                {
                    Debug.WriteLine("Hello");
                });

        }
    }
//...

我试过了:

  1. 上面看到的内容
  2. 仅通过C#创建工具栏按钮(并向ToolbarItem构造函数添加async () => { ... }参数)
  3. 常规的&#39; (object sender, System.EventArgs e) => { ... }事件监听器(通过代码.Clicked +=

1 个答案:

答案 0 :(得分:0)

我认为这是一个绑定上下文问题。如果您将命令放入一个单独的类(理想情况下是ViewModel)并将其用作页面的绑定上下文,那么它应该按预期工作

public class MyVm {
    public MyVm() {
        this.CreateCommand = new Command((sender) =>
        {
            Debug.WriteLine("Hello");
        });
    }

    public ICommand CreateCommand { get; private set; }
}

...

public SetsPage() {
        var vm = new MyVm();
        this.BindingContext = vm;

        InitializeComponent();
...