我正在使用 MvvmCross 重构一个应用程序,并且正在获取要在三个平台上显示的设置 View :WP7、Android 和 iPhone。我创建了一个 SettingsViewModel,其中包含两个列表。一个包含轮询服务器的更新频率,另一个包含轮询哪个服务器的信息。这些称为 UpdateFrequencies 和 PublicSites。这两个列表在 SettingsViewModel 中都有一个属性,用于确定选择了哪个 UpdateFrequency 和哪个 Site,即 UpdateFrequency 和 SelectedSite。
在 WP7 上,此数据绑定(bind)到 ListPicker,如下所示:
<toolkit:ListPicker
Name="UpdateFrequencies"
ItemsSource="{Binding UpdateFrequencies}"
SelectedItem="{Binding UpdateFrequency, Mode=TwoWay}"
Header="Real-time data update frequency"
/>
类似地,在 Android 上它也绑定(bind)到 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'}}"
/>
现在我试图在 iPhone 上做同样的事情,但我似乎不知道如何以类似的方式绑定(bind)它。我一直在查看我能找到的所有样本,但似乎找不到类似的东西。有人可以指出我正确的方向吗?
最佳答案
mvvmcross ios 源当前不包含此内容 - 因此您需要编写自己的源。
如果您使用单点触控对话框,那么这意味着您需要创建一个新的元素类型并使用它来显示静态文本字段(当前值)和选择器 View (选项列表) .
好消息是,这与当前的 TimeElement 和 DateElement 所做的非常相似 - 因此您可以使用其中之一作为起始模板。要调整此模板,您需要:
- 更改它,使值基于字符串而不是日期时间
- 添加一个列表公共(public)属性 - 这将是选项列表。由于这是公共(public)的属性,因此可以自动将其用于数据绑定(bind)。
- 调整 Selected 处理程序,以便元素在点击时显示基于简单文本的选取器 View ,而不是日期或时间选取器 View - 请访问 wally 的博客,了解有关使用选取器 View 的信息 (http://weblogs.asp.net/wallym/archive/2010/01/07/uipicker-in-the-iphone-with-monotouch.aspx) - 或遵循上面 @r4j 的建议
- 添加一个选择器 View 模型,显示正确的值(来自选项),默认为当前值,并在选择器完成时设置值(设置值将导致绑定(bind)的 ViewModel 属性也被更新) .
此方法确实假设显示选择器时“值”和“选择”列表不会更改 - 但这对于大多数用途来说是一个非常安全的假设。
抱歉,我现在无法提供示例代码(或库的附加内容)。如果其他人没有打败我,那么我会在几天后回到开发箱时尝试添加一个。
作为一个额外的想法,为这些设置提供 ui 的另一种方法是尝试在 monotouch.dialog 中使用单选/单选组方法。但是,恐怕这还需要一些新的 Element 工作 - 因为当前的 radio 实现未设置为动态地处理(绑定(bind)到)选择列表。当我有时间时,我也会考虑添加这个 - 因为我认为这将是一个非常有用的添加。
关于xamarin.ios - MvvmCross:MonoTouch 中的绑定(bind)列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12160239/