MVVMCross Android:绑定未更新的值

时间:2015-05-03 08:50:03

标签: c# android binding xamarin mvvmcross

我使用Xamarin(Android)+ Mvvmcross创建了简单的应用程序。我在ViewModel中有属性Data(类型MyData)。

这是我的VievModel

public class MyViewModel:MvxViewModel
{
    private MyData _data;
    public MyData Data
    {
        get { return _data; }
        set
        {
            _data = value;
            RaisePropertyChanged(() => Data);
        }
    }
    ....
}

public class MyData: INotifyPropertyChanged
{
    public string Current
    {
        get { return _current; }
        set
        {
            _current = value;
            Debug.WriteLine(_current);
            NotifyPropertyChanged("Current");
        }
    }
    private string _current;

    public event PropertyChangedEventHandler PropertyChanged;
    public void NotifyPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

我在视图中使用此绑定

 xmlns:local="http://schemas.android.com/apk/res-auto"

<TextView
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 local:MvxBind="Text Data.Current"
 android:id="@+id/textView" />

这是我的计时器:

 private Timer _timer;
 .....
 public void InitEvent(Action action)
 {
     _timer.Elapsed += TimerTick;
     _action = action;
 }

 private void TimerTick(object sender, ElapsedEventArgs e)
 {
     if (_action != null)
            _action(); 
 }

在_action update proprrty Current。

更新value属性时TextView中的文本不会更改。问题是什么?   计时器上的值已更改。 Debug.WriteLine(_current) - 显示新值。 TextView.Text - 旧值,未更新。

1 个答案:

答案 0 :(得分:5)

您的“计时器”是否在后台线程上运行?

如果是,那么你需要找到一些方法来通知UI线程上的RaisePropertyChanged

执行此操作的一种简单方法是从MvxNotifyPropertyChanged继承 - 它会自动将通知封送到用户界面。

另一种方法是使用IMvxMainThreadDispatcher - 例如

public string Current
{
    get { return _current; }
    set
    {
        _current = value;
        Debug.WriteLine(_current);
        Mvx.Resolve<IMvxMainThreadDispatcher>()
           .RequestMainThreadAction(() => NotifyPropertyChanged("Current"));
    }
}

当然,如果多个线程正在访问set Current,那么您也可能遇到奇怪的线程错误......