未设置ListView.ItemTemplate且未触发事件

时间:2017-02-25 20:33:52

标签: c# xaml listview xamarin

我正在开发一个Xamarin项目,以了解它是如何工作的,但我遇到了一个我似乎无法解决的问题。

我有一个listview itemplate存储在我的XAML中的listview标签内,它定义了一个标签,该标签的文本是来自数据源的绑定集,尽管当我的项目通过itemsource加载时它使用我的重写tostring而不是我的绑定,这会导致问题。我的itemtapped事件处理程序也没有工作,似乎没有被解雇。我正在使用VS for mac。

这是表单

的XAML
<?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="BrainStorageApp.MainPage"
             Title="View Notes">
  <ListView ItemsSource="{Binding Items}"
            x:Name="MainListView"
            HasUnevenRows="true"
            IsGroupingEnabled="true"
            IsPullToRefreshEnabled="true"
            IsEnabled="true"
            CachingStrategy="RecycleElement"
            IsRefreshing="{Binding IsBusy, Mode=OneWay}"
            RefreshCommand="{Binding RefreshDataCommand}">
    <ListView.Header>
      <StackLayout Padding="40" 
                   Orientation="Horizontal"
                   HorizontalOptions="FillAndExpand"
                   BackgroundColor="{StaticResource Primary}}">
        <Label Text="Your Notes"
               HorizontalTextAlignment="Center"
               HorizontalOptions="FillAndExpand"
               TextColor="White"
               FontAttributes="Bold"/>
      </StackLayout>
    </ListView.Header>
        <ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell>
                    <Label Text="{Binding title}" FontSize="14" />
                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</ContentPage>

希望我不只是愚蠢而且缺少一些东西,因为我的XAML似乎构建良好,我的itemsource似乎工作正常。如果您需要查看我的代码,只需注释,我将编辑提供。

编辑:不确定它是否有任何区别,但此页面位于标签页。

编辑2:这是我的主要xaml.cs文件的代码,如要求的那样。

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;

namespace BrainStorageApp
{
    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class MainPage : ContentPage
    {

        private BrainstorageApiClass BrainstorageClass;
        private UserClass User;

        public MainPage(string username)
        {
            InitializeComponent();
            BrainstorageClass = new BrainstorageApiClass();
            User = new UserClass();
            User.Username = username;
            BindingContext = new ListViewPageViewModel(BrainstorageClass.LoadNotes(User.Username));
        }

        void Handle_ItemTapped(object sender, Xamarin.Forms.ItemTappedEventArgs e)
        {
            Console.WriteLine(sender.ToString());
        }
    }



    class ListViewPageViewModel : INotifyPropertyChanged
    {
        public ObservableCollection<NoteItem> Items { get; }

        public ListViewPageViewModel(List<NoteItem> list)
        {
            Items = new ObservableCollection<NoteItem>(list);
            RefreshDataCommand = new Command(
                async () => await RefreshData());
        }

        public ICommand RefreshDataCommand { get; }

        async Task RefreshData()
        {
            IsBusy = true;
            //Load Data Here
            await Task.Delay(2000);

            IsBusy = false;
        }

        bool busy;
        public bool IsBusy
        {
            get { return busy; }
            set
            {
                busy = value;
                OnPropertyChanged();
                ((Command)RefreshDataCommand).ChangeCanExecute();
            }
        }


        public event PropertyChangedEventHandler PropertyChanged;
        void OnPropertyChanged([CallerMemberName]string propertyName = "") =>
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

编辑3:

NoteItem

namespace BrainStorageApp
{
    public class NoteItem
    {
        public int id;
        public string title;
        public string content;
        public DateTime createdat;
        public DateTime updatedat;

        public NoteItem(JToken Token)
        {
            id = int.Parse(Token["id"].Value<string>());
            title = Token["Note_Title"].Value<string>();
            content = Token["Note_Content"].Value<string>();
            createdat = DateTime.Parse(Token["created_at"].Value<string>());
            updatedat = DateTime.Parse(Token["updated_at"].Value<string>());
        }

        public override string ToString()
        {
            return title;
        }
    }
}

1 个答案:

答案 0 :(得分:2)

如果要绑定某些内容,则必须是属性。 title不是财产。

public class NoteItem
{
    public int id {get;}
    public string title {get;}
    public string content {get;}
    public DateTime createdat {get;}
    public DateTime updatedat {get;}
}

注意

通常在C#中,属性以大写字母开头。

public class NoteItem
{
    public int Id {get;}
    public string Title {get;}
    public string Content {get;}
    public DateTime CreateDate {get;}
    public DateTime UpdateDate {get;}
}

但不要忘记更新你的绑定。

<Label Text="{Binding Title}" FontSize="14" />