我正在构建一个涉及从列表中添加项目的表单,但是向用户显示的列表取决于来自另一个列表的选择。为此,我有两个MvxSpinner,每个都有一个绑定的ItemsSource和SelectedItem。
<MvxSpinner
android:layout_width="300dp"
android:layout_height="50dp"
local:MvxBind="ItemsSource item_source_one; SelectedItem selected_item_one;"/>
<MvxSpinner
android:layout_width="300dp"
android:layout_height="50dp"
local:MvxBind="ItemsSource item_source_two; SelectedItem selected_item_two;"/>
当selected_item_one
更改item_source_two
更改为新列表时。所有这些都有效,除非更改item_source_two
selected_item_two
,保持与更改前相同。我希望selected_item_two
能够匹配item_source_two
更改时视觉显示的内容。
答案 0 :(得分:1)
微调器绑定在MvvmCross中并不完美 - 特别是SelectedItem
更改必须在ItemsSource
更改后发送。
要解决此问题,您可以在SelectedItem
之后发出虚假ItemsSource
更改的信号 - 例如类似的东西:
RaisePropertyChanged(() => item_source_two);
RaisePropertyChanged(() => selected_item_two);
如果你想更全面地解决这个问题,你也可以考虑重写MvxSpinner - 遗憾的是你不能轻易继承,因为我们错过了虚拟,但你做了类似的事情:
public class MySpinner : MvxSpinner
{
public MySpinner(Context context, IAttributeSet attrs)
: base(context, attrs)
{
}
[MvxSetToNullAfterBinding]
public new IEnumerable ItemsSource
{
get { return base.ItemsSource; }
set
{
// TODO - work out what the current selection and store it in a local variable
base.ItemsSource = value;
// TODO - reset the current selection here from the local variable
}
}
}
答案 1 :(得分:0)
我必须这样做......
public class MySpinner : MvxSpinner
{
public MySpinner(Context context, IAttributeSet attrs):base(context,attrs)
{
}
[MvxSetToNullAfterBinding]
public new IEnumerable ItemsSource
{
get { return base.ItemsSource; }
set
{
base.ItemsSource = null;
base.ItemsSource = value;
}
}
}
之后,在您键入时更新了集合! :)