在某种程度上,这感觉就像这只是“UI 眼睛糖果”——因此属于“视图关注”的范围——因此 mvvmcross 通常不会尝试跨平台。
但是...我认为有办法。
如果 ViewModel 中的命令处理程序也在 ViewModel 上设置了 CurrentSelectedPosition 整数,则每个 UI 都可以将 ViewModel 中的 SelectedItemPosition 绑定到每个 ui 中的每个列表 - 这应该会导致 UI 本地更新选择。
我认为这会起作用......但在 Android 上它需要一些绑定:
public class MvxAdapterViewSelectedItemPositionTargetB-inging : MvxBaseAndroidTargetBinding
{
private readonly AdapterView _adapterView;
public MvxAdapterViewSelectedItemPositionTargetBinging(AdapterView adapterView)
{
_adapterView = adapterView;
_adapterView.ItemSelected += AdapterViewOnItemSelected;
}
public override void SetValue(object value)
{
_adapterView.SetSelection((int)value);
}
private void AdapterViewOnItemSelected(object sender, AdapterView.ItemSelectedEventArgs itemSelectedEventArgs)
{
FireValueChanged(itemSelectedEventArgs.Position);
}
public override MvxBindingMode DefaultMode
{
get
{
return MvxBindingMode.TwoWay;
}
}
public override Type TargetType
{
get
{
return typeof(Int32);
}
}
protected override void Dispose(bool isDisposing)
{
if (isDisposing)
{
if (_adapterView != null)
{
_adapterView.ItemSelected -= AdapterViewOnItemSelected;
}
}
base.Dispose(isDisposing);
}
}
注册使用:
registry.RegisterFactory(new MvxCustomBindingFactory<AdapterView>("SelectedItemPosition", adapterView => new MvxAdapterViewSelectedItemPositionTargetBinging(adapterView)));
并绑定到 axml 中的 UI,例如:
<Mvx.MvxBindableListView
android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
local:MvxBind="{'ItemsSource':{'Path':'Emails'},'SelectedItemPosition':{'Path':'CurrentSelectedPosition'}}"
local:MvxItemTemplate="@layout/listitem_email"
/>
我使用 ViewModel 列表项所在的电子邮件列表测试了这个想法:
public class SimpleEmail
{
public EmailViewModel Parent { get; set; }
public string From { get; set; }
public string Header { get; set; }
public string Message { get; set; }
public ICommand Command1
{
get
{
return new MvxRelayCommand(() => Parent.CurrentSelectedPosition = Parent.Emails.IndexOf(this));
}
}
}
注意:我在上面的代码中使用了选定的位置而不是选定的对象 - 因为我知道您使用的列表很长!
如果您想考虑对仅适用于 android 的代码采用不同的方法,那么我认为您可以通过从 Mvx.MvxBindableListView (也可能是列表项)继承并使用这些类以可能不那么痛苦的方式更新选择来做到这一点.