将label.Text绑定到从Xamarin

时间:2018-07-09 10:06:50

标签: c# multithreading xamarin binding task

所以我在Xamarin中有一个Monitor Page,在那我需要每秒刷新一次值(从TcpClient获得的值)。 我在CS文件中设置了一个公共String,并在Xaml中进行了一些基本的绑定,如下所示:<Label Text="{Binding myString}"/>

在我后面的代码中,我运行了一个异步任务,该任务刷新了myString。任务看起来像这样:

protected async Task syncDisplay(){
            while(true){
                //TcpClient going on, getting some values
                myString = System.Text.Encoding.ASCII.GetString(data, 0, bytes);
            }
        }

然后我只是在运行任务的地方创建一个新线程。就这样。问题是没有值更新到我的UI。当我尝试为Task外部的String赋值时,它可以正常工作。我确定我在这里错过了一些必不可少的东西,但我真的不知道是什么。

预先感谢

1 个答案:

答案 0 :(得分:3)

1)您是否在应用中使用MVVM

2)如果需要,请确保在View

中设置了DataContext

3)在viewModel(VM)中,您需要myString

属性
    private string _myString;
    public string MyString
    {
        get => _myString;
        set
        {
            _myString = value;
            NotifyPropertyChanged(() => MyString);
        }
    }

4)所有用于更新UI的代码都必须位于UI线程中,例如

protected async Task syncDisplay(){
        while(true){
            //TcpClient going on, getting some values
        Device.BeginInvokeOnMainThread(()=>MyString = System.Text.Encoding.ASCII.GetString(data, 0, bytes));

        }
    }