当前位置: 首页 > 知识库问答 >
问题:

列表视图包含在TabBedPage不从绑定更新

顾学真
2023-03-14

在下面的代码中,我绑定记录形成一个视图模型,它使用的是一个可观察的代码,我还提高了intifyProperties tychange,现在我有一个按钮设置,它使用navigation.pushasync的方法去一个新的页面,在那里我更新数据库记录,我已经在这个新页面中创建了一个列表视图,并使用这里显示的相同的绑定来绑定记录,每当我添加它更新的东西,但如果我按后退按钮,回到这个EntryTabPage绑定不更新,它只更新,如果我完全关闭应用程序并重新启动它数据显示。

我想更新这个listview,但不知道该怎么做,我尝试过使用onappearing并在Listviewname中键入。itemssource=记录;但这表明了一个错误“这在当前的情况下并不存在”。如果能在正确的方向上提供帮助,我们将不胜感激。

注意:绑定在选项卡页面以外的其他地方工作。这是层次结构选项卡页面-

<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个答案

贺季
2023-03-14

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

只需添加这一行就可以修复我的代码

public static Workingclass classInstance = new Workingclass;

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

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

皇甫浩壤
2023-03-14

您可能需要使用这个。DataContext=这个 让它工作。在我的例子中,只有当我打印一个MessageBox时,它才会显示列表。在分配ItemsSource之前显示()。我通过添加上面的行来修复它。希望有帮助!

邓开济
2023-03-14

在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());
            }
        }
    }
}
 类似资料:
  • 我有一个GeoPandas df: 看起来像: 如何将坐标列转换为LineString(无论元组列表中有多少个点)?例如。: 编辑:我试过(见Prateek的回答): 以及: 两者都返回以下错误: 属性错误回溯(上次调用)~/opt/anaconda3/lib/python3.8/site-packages/shapely/speedups//u speedups.pyx in shapely.s

  • 当使用(来自maven central或生成mojo时的输出)时,SLF4j会给出错误 SLF4J:类路径包含多个SLF4J绑定 SLF4J:在[jar:file:~/.ivy2/cache/org.SLF4J/slf4j-log4j12/jars/slf4j-log4j12/jars/slf4j-log4j12-1.7.5.jar!/org/SLF4J/impl/staticloggerbind

  • ListView控件用于显示项列表。 与TreeView控件一起,它允许您创建类似Windows资源管理器的界面。 让我们从工具箱中单击ListView控件并将其放在表单上。 ListView控件显示项目列表以及图标。 ListView控件的Item属性允许您添加和删除项目。 SelectedItem属性包含所选项的集合。 MultiSelect属性允许您在列表视图中设置选择多个项目。 Check

  • 在EJS中包含外部文件似乎从来没有一种简单的方法。 我的项目结构是这样的。如此简单却让人心痛: 在内部,我必须包含。我很幸运地遵循了他们的文档:https://ejs.co/#docs并以这种方式包含文件,因为“include相对于包含调用的模板”, 在中,我像这样编译模板: 但我却犯了这个错误! 我已经在编译选项中设置了视图路径。我试过有路/无路。我还尝试在相同的视图路径上设置。 我错过了什么?

  • 问题内容: 我正在开始一个大型的Codeigniter项目,并想尝试为内容片段(如可能在不同页面/控制器上显示的数据循环)创建一些可重用的“迷你”视图。 从主控制器的视图中调用视图更好吗?如果是这样,怎么办?还是应该从控制器调用“迷你视图”,然后将视图的代码传递给主视图? 问题答案: 其他视图中的视图称为 嵌套视图 。在CodeIgniter中包括嵌套视图的方法有两种: 1.将嵌套视图加载到控制器

  • 我想在android中从mysql数据库中检索数据,并在textview中显示 这是后台asynctask代码 }