MvvMCross UITableView将本地属性绑定到UITableViewCellAccessory.CheckMark

时间:2014-03-31 14:21:36

标签: uitableview xamarin.ios mvvmcross

您好我在尝试将MvxTableViewCell附件Checkmark绑定到本地属性时遇到问题。我试过了Bind MvxBindableTableViewCell's Accessory to boolean

上的例子

我对IOS很新,甚至对MvvmCross更新,所以如果我犯了任何愚蠢的错误我会道歉

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


    public TaxaListCellView (IntPtr handle) : base (handle)
    {
        Accessory = UITableViewCellAccessory.Checkmark;
        SelectionStyle = UITableViewCellSelectionStyle.None;

        this.DelayBind (() => {
            var set = this.CreateBindingSet<TaxaListCellView, TaxonViewModel>();
            set.Bind(lblSelectedTaxon).To(s => s.Name);
//I've been playing around with both ways below, and a few different 
//variants without any success
            //set.Bind("IsChecked").To(s => s.IsSelected).TwoWay();
            //set.Bind(@"'IsChecked':{'Path':'IsSelected'");
            set.Apply();
        });
    }

    public bool IsChecked
    {
        get { return Accessory == UITableViewCellAccessory.Checkmark; }
        set { Accessory = value ? UITableViewCellAccessory.Checkmark : UITableViewCellAccessory.None; }
    }

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

    public override void SetSelected (bool selected, bool animated)
    {
        Accessory = selected ? UITableViewCellAccessory.Checkmark : UITableViewCellAccessory.None;

        base.SetSelected (selected, animated);
    }
}

我不确定我的MvxTableViewController是否有任何问题,但这里是代码

public class TaxaListView : MvxTableViewController
{
    public TaxaListView()
    {
        Title = "Taxon List";
    }

    private UISearchBar _searchBar;


    public override void ViewDidLoad()
    {
        base.ViewDidLoad();
        _searchBar = new UISearchBar(new RectangleF(0,0,320, 44))
        {
            AutocorrectionType = UITextAutocorrectionType.Yes,                
        };
        _searchBar.SearchButtonClicked += SearchBar_SearchButtonClicked;
        _searchBar.TextChanged += SearchBarOnTextChanged;

        var source = new MvxSimpleTableViewSource(TableView, TaxaListCellView.Key, TaxaListCellView.Key);

        var set = this.CreateBindingSet<TaxaListView, TaxaListViewModel> ();
        set.Bind (source).To (vm => vm.Taxa);
        set.Bind (source)
        .For (s => s.SelectionChangedCommand)
        .To (vm => vm.ItemSelectedCommand);

        set.Apply ();

        TableView.RowHeight = 50;
        TableView.Source = source;
        TableView.AllowsSelection = true;
        TableView.AllowsSelectionDuringEditing = true;
        TableView.TableHeaderView = _searchBar;

        TableView.ReloadData();
    }

    private void SearchBarOnTextChanged(object sender, UISearchBarTextChangedEventArgs uiSearchBarTextChangedEventArgs)
    {
        if(string.IsNullOrWhiteSpace(_searchBar.Text))
        {
            ((TaxaListViewModel) ViewModel).SearchTaxaByText(string.Empty);
        }
    }

    void SearchBar_SearchButtonClicked(object sender, System.EventArgs e)
    {   
        ((TaxaListViewModel)ViewModel).SearchTaxaByText(_searchBar.Text);
    }
}

当我首先从列表中选择一个项目时 When I Select an item from the list first 当我开始搜索时,即使我回到项目列表中也会发生 When I start searching, Or happens even if I go back into the List of items

1 个答案:

答案 0 :(得分:2)

正如Stuart所提到的那样,我需要告诉ViewModel值已经改变了。 我删除了SetSelelted方法,因为这在加载单元格时导致了问题

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

    private const string BindingText = "Name Name; IsChecked IsSelected";

    public TaxaListCellView() : base(BindingText)
    {
        Accessory = UITableViewCellAccessory.Checkmark;
        SelectionStyle = UITableViewCellSelectionStyle.None;

    }

    public TaxaListCellView (IntPtr handle) : base (BindingText,handle)
    {
        Accessory = UITableViewCellAccessory.Checkmark;
        SelectionStyle = UITableViewCellSelectionStyle.None;
    }

    public string Name
    {
        get { return lblSelectedTaxon.Text; }
        set { lblSelectedTaxon.Text = value; }
    }

    public bool IsChecked
    {
        get { return Accessory == UITableViewCellAccessory.Checkmark; }
        set { Accessory = value ? UITableViewCellAccessory.Checkmark : UITableViewCellAccessory.None; }
    }

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

在我的TaxaListView类

 public override void ViewDidLoad()
    {
        base.ViewDidLoad();
        _searchBar = new UISearchBar(new RectangleF(0,0,320, 44))
        {
            AutocorrectionType = UITextAutocorrectionType.Yes,                
        };
        _searchBar.SearchButtonClicked += SearchBar_SearchButtonClicked;
        _searchBar.TextChanged += SearchBarOnTextChanged;

        var source = new MvxSimpleTableViewSource(TableView, TaxaListCellView.Key, TaxaListCellView.Key);

        var set = this.CreateBindingSet<TaxaListView, TaxaListViewModel> ();
        set.Bind (source).To (vm => vm.Taxa);
        set.Bind (source)
        .For (s => s.SelectionChangedCommand)
        .To (vm => vm.ItemSelectedCommand);

        set.Apply ();

        TableView.RowHeight = 50;
        TableView.Source = source;
        TableView.AllowsSelection = true;
        TableView.AllowsSelectionDuringEditing = true;
        TableView.TableHeaderView = _searchBar;

        TableView.ReloadData();
    }

我绑定selectedChangedCommand并在我的ViewModel类中引发Property更改事件

private MvxCommand<TaxonViewModel> _itemSelectedCommand;

    public ICommand ItemSelectedCommand
    {
        get
        {
            _itemSelectedCommand = _itemSelectedCommand ?? new MvxCommand<TaxonViewModel>(DoSelectedItem);
            return _itemSelectedCommand;
        }
    }

    private void DoSelectedItem(TaxonViewModel item)
    {
        Taxa.First(r => r.TaxonId == item.TaxonId).IsSelected = true;

        RaisePropertyChanged("Taxon");
    }