【问题标题】:Xamarin MVVMCross Change List ContentXamarin MVVMCross 更改列表内容
【发布时间】:2017-05-10 13:07:00
【问题描述】:

我使用的是 MVVMCross 4.4.0,我的 FirstView 是一个类似于 WhatsApp 的列表视图。当我单击一个项目时,我的 SecondView 是一个普通视图,只有一个字段来更新属性和更改我的 FirstView,但这不会发生。

我的第一次查看代码

public sealed partial class MyOrdersView : MvxViewController
{
    UITableView tableView;

    public MyOrdersView() : base("MyOrdersView", null)
    {
    }

    public override void DidReceiveMemoryWarning()
    {
        base.DidReceiveMemoryWarning();
    }

    public override void ViewDidLoad()
    {
        base.ViewDidLoad();

        tableView = new UITableView
        {
            Frame = new CoreGraphics.CGRect(0, 0, View.Bounds.Width, View.Bounds.Height),
            CellLayoutMarginsFollowReadableWidth = true,
        };
        Add(tableView);

        var tableSource = new MvxSimpleTableViewSource(tableView, OrderCell.Key, OrderCell.Key);
        tableView.Source = tableSource;


        var set = this.CreateBindingSet<MyOrdersView, Core.ViewModels.MyOrdersViewModel>();

        set.Bind(tableSource).To(vm => vm.Tasks);
        set.Bind(tableSource).For(s => s.SelectionChangedCommand).To(vm => vm.ItemSelectedCommand);
        set.Apply();

        tableView.ReloadData();

        Title = "Meus Pedidos";

        AppDelegate app = UIApplication.SharedApplication.Delegate as AppDelegate;

        NavigationItem.SetLeftBarButtonItem(
            new UIBarButtonItem(UIImage.FromBundle("threelines")
                , UIBarButtonItemStyle.Plain
                , (sender, args) => app.SidebarController.ToggleMenu()), true);
    }
}

和视图模型

public class MyOrdersViewModel : BaseViewModel
{
    private IOrderService orderService;

    public ObservableCollection<ValOrders2TO> tasks;

    private MvxCommand<ValOrders2TO> _itemSelectedCommand;

    public MyOrdersViewModel(IOrderService orderService)
    {
        this.orderService = orderService;

        tasks = orderService.getAvailableOrders();

        searchMyOrders();
    }

    private async Task<bool> searchMyOrders()
    {
        orderService.clearAvailableOrders();

        orderService.addAllAvailableOrders(await orderService.searchMyOrders());

        return true;
    }

    public ObservableCollection<ValOrders2TO> Tasks
    {
        get { return tasks; }
        set { tasks = value; RaisePropertyChanged(() => Tasks); }
    }

    public ICommand ItemSelectedCommand
    {
        get
        {
            _itemSelectedCommand = _itemSelectedCommand ?? new MvxCommand<ValOrders2TO>(DoSelectItem);

            return _itemSelectedCommand;
        }
    }
    private void DoSelectItem(ValOrders2TO item)
    {
        ShowViewModel<MyOrdersDetailModel>(new { idOrder = item.id });
    }
}

我的第二次查看代码

public sealed partial class MyOrdersDetailView : MvxViewController<MyOrdersDetailModel>
{
    public MyOrdersDetailView() : base("MyOrdersDetailView", null)
    {
        //ViewDidLoad();
    }

    public override void DidReceiveMemoryWarning()
    {
        base.DidReceiveMemoryWarning();
    }

    public override void ViewDidLoad()
    {
        base.ViewDidLoad();

        var btnBack = UIButton.FromType(UIButtonType.System);
        btnBack.Frame = new CGRect(2, 35, 50, 20);
        btnBack.SetTitle("Voltar", UIControlState.Normal);
        Add(btnBack);

        var set = this.CreateBindingSet<MyOrdersDetailView, Core.ViewModels.MyOrdersDetailModel>();

        set.Bind(txtItemDes).To(vm => vm.txtItemDes);
        set.Bind(btnUpdate).To(vm => vm.update);

        set.Apply();
    }
}

还有视图模型

public class MyOrdersDetailModel : MvxViewModel
{
    public ValOrders2TO _valItem;

    public INC<string> txtItemDes = new NC<string>();

    public MyOrdersDetailModel(IMessageService messageService, IOrderService orderService)
    {
    }

    public ValOrders2TO Item
    {
        get { return _valItem; }
        set { _valItem = value; RaisePropertyChanged(() => Item); }
    }

    public void Init(ValOrders2TO item)
    {
        Item = item;

        ConfigProp();
    }

    void ConfigProp()
    {
        txtItemDes.Value = Item.itemsDes;
    }

    public IMvxCommand Update
    {
        get
        {
            return new MvxCommand(() => updateOrder());
        }
    }
    private bool updateOrder()
    {
        Item.itemsDes = txtItemDes.Value;

        return true;
    }

    public IMvxCommand CloseCommand
    {
        get { return new MvxCommand(() => Close(this)); }
    }
}

这是我的 Bean 代码

public class ValOrders2TO
{
    //[JsonProperty()]
    public int id { get; set; }

    //[JsonProperty()]
    public string itemsDes { get; set; }
}

这是我的 OrderCell

public partial class OrderCell : MvxTableViewCell
{
    public static readonly UINib Nib = UINib.FromName("OrderCell", NSBundle.MainBundle);
    public static readonly NSString Key = new NSString("OrderCell");

    private readonly MvxImageViewLoader _loader;

    public OrderCell(IntPtr handle) : base(handle)
    {
        this.DelayBind(() =>
        {
            var set = this.CreateBindingSet<OrderCell, Core.ValOrders2TO>();

            set.Bind(lblItemDes).To(item => item.itemsDes);

            set.Apply();
        });
    }

    public static OrderCell Create()
    {
        return (OrderCell)Nib.Instantiate(null, null)[0];
    }
}

我知道如何从我的 ListView 中删除项目,如下所示:

orderService.deleteAvailableOrder(Item);

但我不知道如何更新项目列表。

以下是我的打印屏幕

【问题讨论】:

  • 您可以查看this Stack Overflow 帖子,该帖子描述了有关 ViewModel 到 ViewModel 通信的想法。返回时,您可以使用ViewWillAppear 在您的第一个视图中触发数据刷新。

标签: c# ios listview xamarin mvvmcross


【解决方案1】:

尝试为

实现RaisePropertyChanged
public string itemsDes { get; set; }

【讨论】:

    猜你喜欢
    • 2013-11-11
    • 2021-03-21
    • 1970-01-01
    • 1970-01-01
    • 2019-05-17
    • 1970-01-01
    • 2018-06-09
    • 1970-01-01
    • 2018-03-28
    相关资源
    最近更新 更多