C# MVVM将相同的ViewModel交叉绑定到MT.Dialog根元素(iOS)和MvxSpinner(Android)

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

使用MvvmCross,我有一个ViewModel,其中有一个属性我想在iOS和Android中绑定。属性表示用户从项目列表中选择的项目

在iOS中,我使用带有
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); 
        }
    }
}