加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 如何正确绑定和更新Xamarin.Forms ListView?

发布时间:2020-12-15 08:37:15 所属栏目:百科 来源:网络整理
导读:使用MVVM模式,我有一个Model,ViewModel和View,它包含一个ListView. ListView绑定到ViewModel的成员,该成员是Model类的ObservableCollection.我可以使初始显示的绑定工作,并且可以在对视图执行操作时更新适当行的Model类的属性,但是我无法刷新视图,从Observab
使用MVVM模式,我有一个Model,ViewModel和View,它包含一个ListView. ListView绑定到ViewModel的成员,该成员是Model类的ObservableCollection.我可以使初始显示的绑定工作,并且可以在对视图执行操作时更新适当行的Model类的属性,但是我无法刷新视图,从ObservableCollection中的Model类中提取数据. ListView类不包含使无效或强制刷新的方法,这将解决我的问题.更新模型上的数据后,如何刷新ListView?

这是我想要做的一个简单示例:每行包含一个Button和Label.单击按钮后,我可以更新标签,该标签将反映在屏幕上.我需要做的是更新模型,反过来应该强制更新视图.但是,我不能让这个工作.在实际应用程序中,Model的更新将在业务逻辑层中,而不是在视图中,之后我需要强制刷新ListView.

示例代码:

using System;
using System.Collections.ObjectModel;
using Xamarin.Forms;

namespace ListViewTest
{   
    public class Model
    {
        public static int ids = 0;
        public Model(string count) 
        {
            Id = +1;
            Count = count;
        }
        public int Id { get; set; }
        public string Count { get; set; }
    }

    public class ModelList : ObservableCollection<Model>
    {
    }

    public class ViewModel
    {
        ModelList list = new ModelList();
        public ModelList ViewModelList
        {
            get { return list; }
            set 
            { 
                list = value; 
            }
        }
    }

    public partial class MainPage : ContentPage
    {   
        public ViewModel viewModel;

        public class DataCell : ViewCell
        {
            public DataCell()
            {
                var Btn = new Button();
                Btn.Text = "Click";
                var Data = new Label();
                Data.SetBinding(Label.TextProperty,"Count");
                Btn.Clicked += (object sender,EventArgs e) => 
                {
                    Model model = (Model)(((Button)sender).Parent.BindingContext);
                    int count = Convert.ToInt32(model.Count);
                    count++;
                    model.Count = count.ToString();

                    // Need to refresh ListView from data source here... How???
                };

                StackLayout s = new StackLayout();
                s.Orientation = StackOrientation.Horizontal;
                s.Children.Add(Btn);
                s.Children.Add(Data);
                this.View = s;
            }
        }

        public MainPage ()
        {
            viewModel = new ViewModel();
            viewModel.ViewModelList.Add(new Model("0"));
            viewModel.ViewModelList.Add(new Model("0"));
            InitializeComponent();
        }

        public void InitializeComponent()
        {
            ListView listView = new ListView
            {
                ItemsSource = viewModel.ViewModelList,ItemTemplate = new DataTemplate(() =>
                    {
                        return new DataCell();
                    })
            };
            Content = listView;
        }
    }
}

解决方法

我认为你的模型需要实现INotifyPropertyChanged.因此,UI知道模型中的值已更改

这样的事情:

public class Model : INotifyPropertyChanged
{
    // boiler-plate
    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this,new PropertyChangedEventArgs(propertyName));
    }
    protected bool SetField<T>(ref T field,T value,string propertyName)
    {
        if (EqualityComparer<T>.Default.Equals(field,value)) return false;
        field = value;
        OnPropertyChanged(propertyName);
        return true;
    }

    // props
    private string _count;
    public string Count 
    {
        get { return _count; }
        set { SetField(ref _count,value,"Count"); }
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读