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 RootElementRadioElements绑定到RootElementRadioSelected属性(类似于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); 
        }
    }
}

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

Mvvm将相同的ViewModel交叉绑定到MT.Dialog RootElement(iOS)和MvxSpinner(

一个简单的解决方案是使用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