2014-03-31 2 views
1

안녕하세요. 로컬 속성에 MvxTableViewCell 액세서리 Checkmark를 바인딩하는 데 문제가 있습니다. 나는 IOS 아주 새로운 그리고 난 어떤 바보 같은 실수MvvMCross UITableView UITableViewCellAccessory.CheckMark에 로컬 속성 바인딩

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); 
    } 
} 

을 변경 한 경우 MvvmCross 심지어 새로운 그래서 난 사과 난 잘 모르겠어요 Bind MvxBindableTableViewCell's Accessory to boolean

에서 발견 예를 들어 다음과 같은 시도했다 거기에 내 MvxTableViewController 잘못 아무것도하지만, 여기에 내가 When I Select an item from the list first 내가 검색을 시작 먼저 목록에서 항목을 선택하면 코드

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); 
    } 
} 

, 또는 내가 혈중 알코올 농도를 갈 경우에도 발생 k를 항목 목록에 넣으십시오.When I start searching, Or happens even if I go back into the List of items

+0

선택이 UITableView에서 허용되어 있습니까? 그리고 행 중 하나를 선택할 때 SetSelected 트리거가 수행됩니까? – choper

+0

안녕하세요 @ choper, 네, 그게 작동합니다, 미안 해요 내가 다시 마크를 잃게 목록으로 돌아갈 경우 또는 내가 검색 표시 줄을 사용하면 내가 선택한 체크 표시를 잃게됩니다. 더 잘 설명하기 위해 두 개의 화면 잡기를 게시 할 것입니다. 답장을 보내 주셔서 감사합니다 – InitLipton

+0

ViewModel에게 속성이 변경되었음을 알려주고 'public 이벤트 EventHandler IsChecked;'를 추가 한 다음 속성이 변경되면 셀에서이 이벤트를 시작합니다. SetSelected 중에. ** ** 작동 할 수도 있음 (셀의 ViewModel에 아이템이 변경되었다는 것을 알려주는 것이 아무것도 없음) – Stuart

답변

2

스튜어트 역시 암시했듯이 값이 변경되었다고 ViewModel에 알려야했습니다. 나는

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 바인딩 내 뷰 모델 클래스에 내가 속성은 이벤트

을 변경 인상 세포 내 TaxaListView 클래스에서

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]; 
    } 
} 

를로드 할 때이 같은 SetSelelted 방법은 문제를 일으키는 제거

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"); 
    } 
관련 문제