Mvvm将相同的ViewModel交叉绑定到MT.Dialog RootElement(iOS)和MvxSpinner(
本文关键字:RootElement MT Dialog iOS MvxSpinner 绑定 ViewModel Mvvm | 更新日期: 2023-09-27 18:24:53
使用MvvmCross,我有一个ViewModel,它具有我想在iOS和Android中绑定的属性。该属性表示用户从项目列表中选择的项目。
在iOS中,我使用MT实现了该列表。Dialog RootElement
和RadioElements
绑定到RootElement
的RadioSelected
属性(类似于https://github.com/MvvmCross/MvvmCross-Tutorials/blob/master/DialogExamples/DialogExamples.Touch/Views/FirstView.cs):
new Section("Radio") {
new RootElement("Dessert", new RadioGroup("Dessert", 0)) {
new Section {
radioChoices
}
}.Bind(bindings, e => e.RadioSelected, vm => vm.CurrentDessertIndex) as Element
}
其中CurrentDessertIndex
表示所选项目的索引(其为int)。
在Android中,我使用MvxSpinner
作为列表:
<MvxSpinner
android:spinnerMode="dropdown"
local:MvxItemTemplate="@layout/itemspinner"
local:MvxDropDownItemTemplate="@layout/itemspinnerdropdown"
local:MvxBind="ItemsSource radioChoices; SelectedItem CurrentDessert" />
请注意,MvxSpinner
需要绑定到对象(而不是int)。
这意味着我的ViewModel中必须有两个属性来表示相同的东西,具体取决于平台:
public class FirstViewModel : MvxViewModel
{
private int _currentDessertIndex;
public int CurrentDessertIndex
{
get { return _currentDessertIndex; }
set {
_currentDessertIndex = value;
RaisePropertyChanged(() => CurrentDessertIndex);
}
}
private int _currentDessert;
public int CurrentDessert
{
get { return _currentDessert; }
set {
_currentDessert = value;
RaisePropertyChanged(() => CurrentDessert);
}
}
}
如何将其合并为仅使用一个属性?
一个简单的解决方案是使用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-但使用整数选择位置,而不是所选对象本身。请参阅中关于自定义绑定的N+1http://mvvmcross.blogger.com