使用MvvmCross,我有一个ViewModel,其中包含我想在iOS和Android中绑定的属性。该属性表示用户从项目列表中选择的项目。
在iOS中,我使用带有RootElement
的MT.Dialog RadioElements
实现了列表,绑定到RadioSelected
的{{1}}属性(类似于{中的示例) {3}}):
RootElement
其中new Section("Radio") {
new RootElement("Dessert", new RadioGroup("Dessert", 0)) {
new Section {
radioChoices
}
}.Bind(bindings, e => e.RadioSelected, vm => vm.CurrentDessertIndex) as Element
}
表示所选项目的索引( int )。
在Android中,我使用CurrentDessertIndex
作为列表:
MvxSpinner
请注意,<MvxSpinner
android:spinnerMode="dropdown"
local:MvxItemTemplate="@layout/itemspinner"
local:MvxDropDownItemTemplate="@layout/itemspinnerdropdown"
local:MvxBind="ItemsSource radioChoices; SelectedItem CurrentDessert" />
需要绑定到对象(而不是int)。
这意味着我的ViewModel中必须有两个属性代表相同的东西,具体取决于平台:
MvxSpinner
如何将其合并为仅使用一个属性?
答案 0 :(得分:0)
一个简单的解决方案是使用RaisePropertyChanged链接这两个属性 - 例如
public class FirstViewModel : MvxViewModel
{
private int _currentDessertIndex;
public int CurrentDessertIndex
{
get { return _currentDessertIndex; }
set {
_currentDessertIndex = value;
_currentDessert = _desserts[value];
RaisePropertyChanged(() => CurrentDessertIndex);
RaisePropertyChanged(() => CurrentDessert);
}
}
private Dessert _currentDessert;
public Dessert CurrentDessert
{
get { return _currentDessert; }
set {
_currentDessert = value;
_currentDessertIndex = _desserts.IndexOf(_currentDessert);
RaisePropertyChanged(() => CurrentDessertIndex);
RaisePropertyChanged(() => CurrentDessert);
}
}
}
或者,向Android添加自定义绑定以支持项目中的索引位置是相当简单的。您需要将此代码基于https://github.com/MvvmCross/MvvmCross/blob/3.2/Cirrious/Cirrious.MvvmCross.Binding.Droid/Target/MvxSpinnerSelectedItemBinding.cs - 但使用整数选择位置而不是选定对象本身。请参阅http://mvvmcross.blogger.com
中自定义绑定的N + 1