【问题标题】:On a UITableView, can SelectionChangedCommand and OnTableViewScrolled not coexist?在 UITableView 上,SelectionChangedCommand 和 OnTableViewScrolled 不能共存吗?
【发布时间】:2013-11-18 16:33:57
【问题描述】:

我一直在尝试创建一个绑定到 ViewModel 中的 ObservableCollection 的 UITableView,它会在向下滚动时加载更多项目。我还希望能够在选择项目时显示项目的更多详细信息。这是我开始使用的代码:

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

        var source = new MvxSimpleTableViewSource (ReceivablesTableView, ReceivableCell.Key, ReceivableCell.Key);
        ReceivablesTableView.Source = source;

        var set = this.CreateBindingSet<ReceivablesListView, ReceivablesListViewModel> ();
        set.Bind (source).To (vm => vm.Receivables);
        set.Bind (source).For (s => s.SelectionChangedCommand).To (vm => vm.ShowDetailCommand);
        set.Apply ();
        ReceivablesTableView.Scrolled += OnTableViewScrolled;
    }

这会正确加载并显示所有项目;但是,我发现,除非我删除对ReceivablesTableView.Scrolled 的事件处理程序分配,否则SelectionChangedCommand 似乎永远不会触发。相反,如果我将处理程序向上移动,使其成为调用的第一个命令,则SelectionChangedCommand 会触发,但OnTableViewScrolled 不会触发。

这两个事件不能共存吗?是不是我做的不对?

【问题讨论】:

    标签: mvvmcross


    【解决方案1】:

    当您使用像 Scrolled 这样的 Xamarin 事件时,它会创建将用作 TableView 的委托的存根对象。默认情况下,源将作为DataSourceDelegate 工作,因此它可以接收来自TableView 的事件。当您手动订阅Scrolled 事件时,您的源将仅作为DataSource 工作,因此它不会收到RowSelected 事件。

    【讨论】:

      【解决方案2】:

      似乎分配 Scrolled 事件委托会删除先前分配的委托,因此您只能在此 link 中拥有一个委托的更多信息。

      一个对我有用的解决方案是覆盖源中的 Scrolled 并使用 TableView 将消息发布回 ViewController,如下所示:

      具有覆盖滚动发布 ScrolledMessage 的表源

      public class MyTableSource : MvxTableViewSource
      {
          private IMvxMessenger _mvxMessenger;
      
          public MyTableSource (UITableView tableView)
              : base (tableView)
          {
              _mvxMessenger = Mvx.Resolve<IMvxMessenger>();
              tableView.RegisterNibForCellReuse (MyCell.Nib, MyCell.Key);
          }
      
          public override void Scrolled (UIScrollView scrollView)
          {
              _mvxMessenger.Publish<ScrolledMessage>(new ScrolledMessage(this, scrollView.ContentOffset.Y));
          }
      
          // Other overriden methods 
      
          public override void RowSelected (UITableView tableView, NSIndexPath indexPath)
          {
              // implement this
          }
      
          public override nfloat GetHeightForRow (UITableView tableView, NSIndexPath indexPath)
          {
              // implement this
          }
      
          public override nfloat EstimatedHeight (UITableView tableView, NSIndexPath indexPath)
          {
              // implement this
          }
      
          protected override UITableViewCell GetOrCreateCellFor (UITableView tableView, NSIndexPath indexPath, object item)
          {
              // implement this
          }
      }
      

      滚动消息

      public class ScrolledMessage : MvxMessage
      {
          public nfloat Offset { get; set; }
          public ScrolledMessage (object sender, nfloat offset) : base(sender)
          {
              Offset = offset;
          }
      }
      

      接收滚动消息的视图控制器

      public class FirstView : MvxViewController
      {
      
          private MvxSubscriptionToken _token;
          private IMvxMessenger _mvxMessenger;
          UITableView TableView;
      
          public override void ViewDidLoad ()
          {
              _mvxMessenger = Mvx.Resolve<IMvxMessenger>();
              _token = _mvxMessenger.SubscribeOnMainThread<ScrolledMessage>(message => Scrolled (message.Offset));
      
              TableView = new UITableView (new CGRect(0, 0, View.Frame.Width, View.Frame.Height));
              source = new MyTableSource (TableView);
              TableView.Source = source;
              Add (TableView);
      
              var set = this.CreateBindingSet<FirstView, FirstViewModel> ();
              set.Bind (source).For(s => s.ItemsSource).To (vm => vm.Items);
              set.Apply ();
      
              TableView.ReloadData ();
          }
      
          void Scrolled(nfloat offset)
          {
              // Do scroll here
          }
      }
      

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 2017-08-23
        • 1970-01-01
        • 2019-11-08
        • 2012-03-29
        • 1970-01-01
        • 2014-01-25
        • 2023-03-15
        • 2014-10-07
        • 1970-01-01
        相关资源
        最近更新 更多