Xamarin.ios 更改MvxPickerViewModel的内容

Xamarin.ios 更改MvxPickerViewModel的内容,xamarin.ios,xamarin,mvvmcross,Xamarin.ios,Xamarin,Mvvmcross,我正在编写一个包含项目数据库的简单应用程序。这些项具有类型、制造商、型号和一些其他属性。我已经用MvxPickerViewModel实现了三个UIPickerView,如MvvmCross的N+1系列的N=19所述。对于每种类型、制造商和型号,都有一个UIPickerView/MvxPickerViewModel(一次屏幕上只有一个)。但是,如果我更新MvxPickerViewModel的ItemSource数据,UIPickerView中已经可见的行在滚动到屏幕外之前不会刷新。N=19示例不更

我正在编写一个包含项目数据库的简单应用程序。这些项具有类型、制造商、型号和一些其他属性。我已经用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);
    }
public覆盖void ViewDidLoad()
{
base.ViewDidLoad();
NavigationController.NavigationBarHidden=true;
var comparableTableViewSource=新MVX标准TableViewSource(ComparableLV);
ComparableLV.Source=comparableTableViewSource;
var ManufacturerPicker=新的UIPickerView();
var manufacturerPickerModel=新的MvxPickerViewModel(ManufacturerPicker);
ManufacturerPicker.Model=manufacturerPickerModel;
ManufacturerPicker.ShowSelectionIndicator=true;
ManufacturerTextField.InputView=ManufacturerPicker;
var ModelPicker=new UIPickerView();
var modelPickerModel=新的MvxPickerViewModel(ModelPicker);
ModelPicker.Model=modelPickerModel;
ModelPicker.ShowSelectionIndicator=true;
ModelTextField.InputView=ModelPicker;
var TypePicker=new-UIPickerView();
var typePickerModel=新的MvxPickerViewModel(TypePicker);
TypePicker.Model=typePickerModel;
TypePicker.ShowSelectionIndicator=true;
TypeTextField.InputView=类型选择器;
var set=this.CreateBindingSet();
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=新的UITapGestureRecognitor(()=>{
HornTextField.ResignFirstResponder();
ManufacturerTextField.ResignFirstResponder();
ModelTextField.ResignFirstResponder();
});
视图。AddGestureRecognitor(g);
}
我怀疑当
项目资源本身发生变化时,没有调用
ReloadAllComponents
(或调用
ReloadComponent[0]
),但当集合内部发生变化时,会有调用

作为一种解决方法,可以尝试以下子类:

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…,那也太好了。

感谢您的快速响应和出色的框架。继续努力!“…”号是在寻求帮助吗?如果是,我在哪里可以插上电源?我将此问题记录到-让我知道修复是否有效(或有其他问题-例如selecteditem),我将从代码中获取信息并添加测试应用程序。此问题修复了我的问题。如果我遇到别的事,我会告诉你的。