MvvmCross将相同的ViewModel绑定到MT.Dialog RootElement(iOS)和MvxSpinner(Android)

时间:2014-09-29 10:29:24

标签: c# xamarin mvvmcross monotouch.dialog

使用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

如何将其合并为仅使用一个属性?

1 个答案:

答案 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