MvxSpinner selecteditem没有更新itemssource更改

时间:2014-04-07 16:33:48

标签: android xamarin mvvmcross

我正在构建一个涉及从列表中添加项目的表单,但是向用户显示的列表取决于来自另一个列表的选择。为此,我有两个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更改时视觉显示的内容。

2 个答案:

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

继承自https://github.com/MvvmCross/MvvmCross/blob/v3.1/Cirrious/Cirrious.MvvmCross.Binding.Droid/Views/MvxSpinner.cs

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

之后,在您键入时更新了集合! :)