2

我正在使用 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"
    />

设置查看 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'}}"
    />

设置查看 Android

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

4

2 回答 2

2

mvvmcross ios 源目前不包括这个 - 所以你需要自己编写。

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

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

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

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

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


作为一个额外的想法,为这些设置提供 ui 的另一种方法是尝试在 monotouch.dialog 中使用 radio/radio group 方法。但是,恐怕这也需要一些新的 Element 工作 - 因为当前的无线电实现未设置为动态处理(绑定到)选择列表。当我有时间时,我也会考虑添加这个 - 因为我认为这将是一个非常有用的添加。

于 2012-08-29T23:23:52.053 回答
1

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

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

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

希望这有帮助!

更新:
正如你提到的,我忘记了UIPickerView。但我认为UIPickerView占用太多空间。
我以前这样做过:使用 a UITextField,当用户触摸时,显示actionsheet带有选择器视图的 a ,选择一个项目,然后更新UITextfiled
我推荐actionsheet,因为您可以在其中放置一个取消、完成按钮,用户可以在其中取消或选择一个项目。
这是一个来自 xamarin 的示例,它使用ActionSheetDatePicker

于 2012-08-29T14:32:10.543 回答