MvvmCross:MonoTouch中的绑定列表

时间:2012-08-28 13:23:43

标签: xamarin.ios monotouch.dialog mvvmcross

我正在使用MvvmCross重构一个应用程序,我正在设置视图以在三个平台上显示:WP7,Android和iPhone。我创建了一个包含两个列表的SettingsViewModel。一个具有更新频率以轮询服务器,另一个具有用于轮询哪个服务器的信息。这些被称为UpdateFrequencies和PublicSites。这两个列表在SettingsViewModel中都有一个属性,用于确定选择了哪个UpdateFrequency和哪个站点,UpdateFrequency和SelectedSite。

在WP7上,这些数据绑定到ListPicker,如下所示:

<toolkit:ListPicker 
    Name="UpdateFrequencies"
    ItemsSource="{Binding UpdateFrequencies}"
    SelectedItem="{Binding UpdateFrequency, Mode=TwoWay}"
    Header="Real-time data update frequency"
    />

SettingsView WP7

同样在Android上,它与这样的Spinner绑定:

<cirrious.mvvmcross.binding.android.views.MvxBindableSpinner
    android:id="@+id/SpinnerUpdateFrequencies"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    local:MvxDropDownItemTemplate="@layout/spinneritem_updatefrequencydropdown"
    local:MvxItemTemplate="@layout/spinneritem_updatefrequency"
    local:MvxBind="{'ItemsSource':{'Path':'UpdateFrequencies'},'SelectedItem':{'Path':'UpdateFrequency','Mode':'TwoWay'}}"
    />

SettingsView Android

现在我正在尝试在iPhone上做同样的事情,我似乎无法理解如何以类似的方式绑定它。我一直在查看我能找到的所有样本,似乎找不到类似的东西。有人可能会指出我正确的方向吗?

2 个答案:

答案 0 :(得分:2)

mvvmcross ios源目前不包含此内容 - 因此您需要自己编写。

如果您正在使用单触控对话框,那么这意味着您需要创建一个新的元素类型并使用它来显示静态文本字段(当前值)和选择器视图(选项列表)

好消息是,这与当前的TimeElement和DateElement非常相似 - 所以你可以使用其中一个作为起始模板。要调整此模板,您需要:

  • 更改它以使Value基于String而不是DateTime
  • 添加一个List公共属性 - 这将是Choices列表。由于这是公共和属性,因此可以自动用于数据绑定。
  • 调整Selected处理程序,以便Element在点击时显示一个简单的基于文本的选择器视图而不是日期或时间选择器视图 - 请访问wally的博客,了解有关使用pickerview的信息(http://weblogs.asp.net /wallym/archive/2010/01/07/uipicker-in-the-iphone-with-monotouch.aspx) - 或遵循上面@ r4j的建议
  • 添加一个选择器视图模型,显示正确的值(来自Choices),默认为当前Value,并在选择器完成时设置Value(设置Value将导致绑定的ViewModel属性也被更新)

这种方法确实假设在显示Picker时,Value和Choices列表不会改变 - 但对于大多数用途来说这是一个非常安全的假设。

抱歉,我现在无法提供示例代码(或库的附加内容)。如果其他人没有打败我,那么我会在几天后回到开发盒上时尝试添加一个。


作为一个额外的想法,为这些设置提供ui的另一种方法是尝试在monotouch.dialog中使用无线电/无线电组方法。但是,我担心这还需要一些新的Element工作 - 因为当前的无线电实现没有设置为动态地使用(绑定)一个选择列表。当我有时间的时候,我会考虑添加它 - 因为我认为这将是一个非常有用的补充。

答案 1 :(得分:1)

iOS没有下拉列表或列表视图。我和你有同样的问题。这是我的尝试:

  • 创建UITextField,将其绑定数据作为选定项目。
  • 此TextField的触发事件TouchDown。当用户触摸它时,转移到另一个视图(调用View2)。

  • 在View2中,从ViewModel创建一个TableView绑定列表数据。当用户选择一个项目时,请返回上一个视图,使用新选择的项目更新UITextField

希望这有帮助!

<强>更新
如你所说,我忘了UIPickerView。但我认为UIPickerView会占用太多空间。
之前我做过:使用UITextField,当用户触摸时,显示带有选择器视图的actionsheet,选择一个项目,然后更新UITextfiled
我建议actionsheet,因为您可以在其中放置取消,完成按钮,用户可以取消或选择项目。
来自xamarin的an example使用ActionSheetDatePicker