Xamarin.ios 更改MvxPickerViewModel的内容
我正在编写一个包含项目数据库的简单应用程序。这些项具有类型、制造商、型号和一些其他属性。我已经用MvxPickerViewModel实现了三个UIPickerView,如MvvmCross的N+1系列的N=19所述。对于每种类型、制造商和型号,都有一个UIPickerView/MvxPickerViewModel(一次屏幕上只有一个)。但是,如果我更新MvxPickerViewModel的ItemSource数据,UIPickerView中已经可见的行在滚动到屏幕外之前不会刷新。N=19示例不更新UIPickerView中的项目列表,因此不清楚是否存在问题。我是否犯了错误,或者其他人是否有过这种经历?附近有工作吗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示例不更
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),我将从代码中获取信息并添加测试应用程序。此问题修复了我的问题。如果我遇到别的事,我会告诉你的。