C# MVVM将相同的ViewModel交叉绑定到MT.Dialog根元素(iOS)和MvxSpinner(Android)
使用MvvmCross,我有一个ViewModel,其中有一个属性我想在iOS和Android中绑定。属性表示用户从项目列表中选择的项目 在iOS中,我使用带有C# MVVM将相同的ViewModel交叉绑定到MT.Dialog根元素(iOS)和MvxSpinner(Android),c#,xamarin,mvvmcross,monotouch.dialog,C#,Xamarin,Mvvmcross,Monotouch.dialog,使用MvvmCross,我有一个ViewModel,其中有一个属性我想在iOS和Android中绑定。属性表示用户从项目列表中选择的项目 在iOS中,我使用带有RadioElements的MT.对话框RootElement实现了列表,该对话框绑定到RootElement的RadioSelected属性(类似于中的示例): 其中,CurrentDessertIndex表示所选项目的索引(即int) 在Android中,我使用MvxSpinner作为列表: <MvxSpinner an
RadioElements
的MT.对话框RootElement
实现了列表,该对话框绑定到RootElement
的RadioSelected
属性(类似于中的示例):
其中,CurrentDessertIndex
表示所选项目的索引(即int)
在Android中,我使用MvxSpinner
作为列表:
<MvxSpinner
android:spinnerMode="dropdown"
local:MvxItemTemplate="@layout/itemspinner"
local:MvxDropDownItemTemplate="@layout/itemspinnerdropdown"
local:MvxBind="ItemsSource radioChoices; SelectedItem 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添加一个自定义绑定以支持项目中的索引位置是相当直接的。您需要基于此代码,但使用整数选择位置,而不是选定对象本身。请参阅中自定义绑定的N+1,因为我也很好奇。目前我的所有解决方案都使用两个独立的属性,如您所述,一个用于索引(iOS),另一个用于对象(Android)。不管怎么说,当时我觉得把他们合并成只使用一处房产并不是那么重要。谢谢@Stuart。最后,我为Android spinner创建了一个自定义绑定来使用索引。
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);
}
}
}
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);
}
}
}