如何从Xamarin表单中的另一个类更新列表视图?

时间:2017-03-27 07:54:47

标签: class listview xamarin.forms itemsource

我在一个类中创建了一个列表视图,并从另一个类中调用了delete方法。如果我从另一个类调用,Listview获取调用但不更新列表视图。但是当我在同一个班级里面打电话时它会得到更新。如何解决这个问题?

namespace New
{
    public partial class WishesPage : ContentPage
    {
        ListView listView = new ListView();

        public WishesPage()
        {
            InitializeComponent();

            var arr = JToken.Parse(ids);

            foreach (var ite in arr.Children())
            {
                var itemProperties = ite.Children<JProperty>();
                string contactElement = itemProperties.FirstOrDefault(x => x.Name == "contact").Value.ToString();
                sample.Add(contactElement);
            }

            listView.ItemTemplate = new DataTemplate(typeof(CustomListCell));
            listView.ItemsSource = sample;

            Content = new StackLayout
            {
                Children =
                {
                    listView,
                }
            };
        }

        public async Task delete(string wishid)
        {
            indicator.IsRunning = true;

            var client = new HttpClient();
            client.BaseAddress = new Uri("http:……”);

            if (response == "success")
            {
                listView.ItemsSource = null;
                listView.ItemsSource = sample;
            }
        }
    }

    public class CustomListCell : ViewCell
    {
        public CustomListCell()
        {
              wishIdLabel.SetBinding(Label.TextProperty, new Binding("contact"));

            horizontalLayout.Children.Add(wishIdLabel);

            var deleteAction = new MenuItem { Text = "Delete", IsDestructive = true };
            deleteAction.Clicked += async (sender, e) =>
            {
                WishesPage wishes = new WishesPage();
                wishes.delete(wishId);
            };
            ContextActions.Add(deleteAction);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

我更新了this repo,解释了如何在ViewCell中使用命令。

在您的情况下,您应该在ContentPage中移动ViewCell的构造。像

这样的东西
        lv.ItemTemplate = new DataTemplate(() =>
        {

            StackLayout slView = new StackLayout();

            Label lDesc = new Label();
            lDesc.SetBinding(Label.TextProperty, "Description", stringFormat: "DESCRIPTION: {0}");

            var deleteAction = new MenuItem { Text = "Delete", IsDestructive = true }; // red background
            deleteAction.SetBinding(MenuItem.CommandProperty, new Binding("BindingContext.TrashCommand", source: this));
            deleteAction.SetBinding(MenuItem.CommandParameterProperty, ".");

            slView.Children.Add(lDesc);

            ViewCell vc = new ViewCell() {View = slView };
            vc.ContextActions.Add(deleteAction);

            return vc;
        }

现在,当你长按行时,一个ContextAction&#34;删除&#34;出现并在ViewModel中执行TrashCommand(你应该使用MVVM ......),&#34;这些&#34;传递参数(选定的obj),以便您可以从列表中删除它

        this.TrashCommand = new Command(async (object obj) => {

            try
            {
                if (_isTapped)
                    return;

                if (obj != null)
                    System.Diagnostics.Debug.WriteLine("Obj is not null");
                else
                    System.Diagnostics.Debug.WriteLine("Obj IS null");


                _isTapped = true;
                var ret = await Application.Current.MainPage.DisplayAlert("Attention", "Delete this row?", "Yes", "No");

                if (ret)
                {

                    // List is your "sample" list... Removing the obj, is it reflected to ListView if you use ObservableCollection instead of List
                    List.Remove((Model)obj);
                    Count = List.Count;
                }

                _isTapped = false;

            }
            catch (Exception ex) {
                _isTapped = false;
                await Application.Current.MainPage.DisplayAlert("Attention", ex.Message, "Ok");
            }
        });
    }