更改MvxPickerViewModel的内容

时间:2013-07-15 02:46:47

标签: xamarin.ios xamarin mvvmcross

我正在编写一个包含项目数据库的简单应用程序。这些物品有类型,制造商,型号和一些其他属性。我已经实现了三个带有MvxPickerViewModel的UIPickerView,如MvvmCross的N + 1系列N = 19中所述。每种类型,制造商和模型都有一个UIPickerView / MvxPickerViewModel(一次只有一个在屏幕上)。但是,如果我更新MvxPickerViewModel的ItemSource数据,那么UIPickerView中已经可见的行在它们从屏幕滚动之前不会刷新。 N = 19示例,不更新UIPickerView中的项目列表,因此不清楚问题是否存在于那里。我犯了错误还是有其他人经历过这个?有工作吗?

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

        NavigationController.NavigationBarHidden = true;

        var comparableTableViewSource = new MvxStandardTableViewSource(ComparableLV);
        ComparableLV.Source = comparableTableViewSource;

        var ManufacturerPicker = new UIPickerView();
        var manufacturerPickerModel = new MvxPickerViewModel(ManufacturerPicker);
        ManufacturerPicker.Model = manufacturerPickerModel;
        ManufacturerPicker.ShowSelectionIndicator = true;
        ManufacturerTextField.InputView = ManufacturerPicker;

        var ModelPicker = new UIPickerView();
        var modelPickerModel = new MvxPickerViewModel(ModelPicker);
        ModelPicker.Model = modelPickerModel;
        ModelPicker.ShowSelectionIndicator = true;
        ModelTextField.InputView = ModelPicker;

        var TypePicker = new UIPickerView();
        var typePickerModel = new MvxPickerViewModel(TypePicker);
        TypePicker.Model = typePickerModel;
        TypePicker.ShowSelectionIndicator = true;
        TypeTextField.InputView = TypePicker;

        var set = this.CreateBindingSet<FirstView, FirstViewModel>();
        set.Bind(comparableTableViewSource).For(s => s.ItemsSource).To(vm => vm.Comparables);
        set.Bind(manufacturerPickerModel).For(p => p.ItemsSource).To(vm => vm.Manufacturers);
        set.Bind(manufacturerPickerModel).For(p => p.SelectedItem).To(vm => vm.SelectedManufacturer);
        set.Bind(ManufacturerTextField).To(vm => vm.SelectedManufacturer);
        set.Bind(modelPickerModel).For(p => p.ItemsSource).To(vm => vm.Models);
        set.Bind(modelPickerModel).For(p => p.SelectedItem).To(vm => vm.SelectedModel);
        set.Bind(ModelTextField).To(vm => vm.SelectedModel);
        set.Bind(typePickerModel).For(p => p.ItemsSource).To(vm => vm.Types);
        set.Bind(typePickerModel).For(p => p.SelectedItem).To(vm => vm.SelectedType);
        set.Bind(TypeTextField).To(vm => vm.SelectedType);

        set.Apply();

        var g = new UITapGestureRecognizer(() => {
            HornTextField.ResignFirstResponder();
            ManufacturerTextField.ResignFirstResponder();
            ModelTextField.ResignFirstResponder();
        });

        View.AddGestureRecognizer(g);
    }

1 个答案:

答案 0 :(得分:2)

关注MvxPickerViewModel.cs我怀疑当ReloadAllComponents本身发生变化时,ReloadComponent[0](或ItemsSource}没有电话,但是有电话时Collection内部更改。

作为一种解决方法,也许可以尝试类似的子类:

public class MyPickerViewModel
    : MvxPickerViewModel
{
    private readonly UIPickerView _pickerView;

    public MyPickerViewModel(UIPickerView pickerView)
      : base(pickerViww)
    {
        _pickerView = pickerView;
    }


    [MvxSetToNullAfterBinding]
    public override  IEnumerable ItemsSource
    {
        get { return base.ItemsSource; }
        set
        {
            base.ItemsSource = value;
            if (value != null)
               _pcikerView.ReloadComponent(0);
        }
    }  
}

修复MvvmCross也很棒......