TabbedPage中包含的ListView未从Binding更新

时间:2017-05-30 13:57:00

标签: listview data-binding xamarin.forms tabbedpage

在下面的代码中我绑定记录形成一个viewmodel,它正在使用一个observablecollection,我也提高了inotifypropertychange,现在我有一个按钮设置,它使用navigation.pushasync方法转到一个新页面,在那里即时更新数据库记录,我在这个新页面中创建了一个列表视图,并使用此处显示的相同绑定来绑定记录,每当我添加它更新的内容时,但是如果我按下后退按钮并返回到此EntryTabPage,则绑定不会更新,如果我完全关闭应用程序并重新启动它,它只会更新,显示数据。

我希望更新listview不确定如何操作,我尝试使用onappearing并在Listviewname.itemssource = Records中输入;但这显示错误"这在当前上下文中不存在"任何正确方向的帮助都将受到赞赏。

注意:绑定在其他地方有效,但在选项卡页面中除外。 这是Hierarchy TabbedPage-> ContentPage-> StackLayout-> ListView(在此列表视图中,绑定不会更新。

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         x:Class="Bunk_Master.EntryPageTab1"
         Title="Default">
<StackLayout x:Name="stacklayout">
    <ListView ItemsSource="{Binding Records}"
              x:Name="classListView">
        <ListView.ItemTemplate>
            <DataTemplate>
                <TextCell Text="{Binding}">

                </TextCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
    <Button Text="new" 
            x:Name="addclassbutton">

    </Button>


</StackLayout>

namespace Bunk_Master
{
    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class EntryPageTab1 : ContentPage
    {

        public EntryPageTab1()
        {
            InitializeComponent();
            BindingContext = new ClassViewModel();



            addclassbutton.Clicked += async (object sender, EventArgs e) =>
             {
                 await this.Navigation.PushAsync(new AddClass());
             };


        }

              protected override void OnAppearing()
        {


            base.OnAppearing();


        }



    }



    }

这是ViewModel

    namespace Bunk_Master
{
    public class ClassViewModel : BaseViewModel
    {


        readonly Database db;
        public string classname { get; set; }
       // public int absentnos { get; set; }
      //  public int presentnos { get; set; }

        public ICommand AddCommand { get; set; }
        public ICommand DeleteCommand { get; set; }

        public ObservableCollection<string> Records { get; set; }


        public ClassViewModel()
        {
            AddCommand = new Command(Add);
            DeleteCommand = new Command(Delete);

            db = new Database("classdb");
            db.CreateTable<ClassModel>();
            Records = new ObservableCollection<string>();
            ShowAllRecords();
        }



        void Add()
        {
            var record = new ClassModel
            {
                classname = classname,
                //absentnum = absentnos,
                //presentnum = presentnos
            };
            db.SaveItem(record);
            Records.Add(record.ToString());
            RaisePropertyChanged(nameof(Records));
            ClearForm();

        }

        private void Delete(object obj)
        {
            throw new NotImplementedException();
        }

        void ClearForm()
        {
            classname = string.Empty;

            RaisePropertyChanged(nameof(classname));
        }

        void ShowAllRecords()
        {
            Records.Clear();
            var classdb = db.GetItems<ClassModel>();
            foreach (var classmodel in classdb)
            {
                Records.Add(classmodel.ToString());
            }
        }
    }
}

这是我实现Inotifypropertychange

的地方
namespace Bunk_Master
{
    public class BaseViewModel : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        protected void RaisePropertyChanged([CallerMemberName] string propertyName = "")
        {
            var handler = PropertyChanged;
            if (handler == null) return;
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

3 个答案:

答案 0 :(得分:0)

如果有人碰巧发现一个类在一个类中工作而在另一个类中没有,并且你的代码是完美的,那只是因为必须使用你实例化的类而不是实例化一个新类。

只需添加此行即可修复我的代码

public static Workingclass classInstance = new Workingclass;

然后我使用classIncstance而不是在其他类中创建新实例,并且数据正在正确更新。

注意:我想删除这篇文章,但互联网上有很多其他类似的帖子,没有人解决这个简单的问题,也许有人会觉得它很有用。

答案 1 :(得分:0)

在ClassViewModel中更改,然后尝试。

namespace Bunk_Master
{
    public class ClassViewModel : BaseViewModel
    {


        readonly Database db;
        public string classname { get; set; }
       // public int absentnos { get; set; }
      //  public int presentnos { get; set; }

        public ICommand AddCommand { get; set; }
        public ICommand DeleteCommand { get; set; }

        public ObservableCollection<string> _records;
        public ObservableCollection<string> Records
        {
            get { return _records; }
            set
            {
                _records = value;
                RaisePropertyChanged();
            }
        }
        public ClassViewModel()
        {
            AddCommand = new Command(Add);
            DeleteCommand = new Command(Delete);
            db = new Database("classdb");
            db.CreateTable<ClassModel>();
            _records = new ObservableCollection<string>();
            ShowAllRecords();
        }
        void Add()
        {
            var record = new ClassModel
            {
                classname = classname,
                //absentnum = absentnos,
                //presentnum = presentnos
            };
            db.SaveItem(record);
            _records.Add(record.classname.ToString());
            ClearForm();
        }

        private void Delete(object obj)
        {
            throw new NotImplementedException();
        }

        void ClearForm()
        {
            classname = string.Empty;
        }

        void ShowAllRecords()
        {
            _records.Clear();
            var classdb = db.GetItems<ClassModel>();
            foreach (var classmodel in classdb)
            {
                _records.Add(classmodel.ToString());
            }
        }
    }
}

答案 2 :(得分:0)

您可能需要使用 this.DataContext = this; 才能使其工作。在我的情况下,如果我在分配 ItemsSource 之前打印 MessageBox.Show(),它只会显示列表。我通过添加上面的行来修复它。 希望能帮到你!