将 label.Text 绑定到从 Xamarin 中的异步任务更新的字符串

Eli*_*nes 1 c# binding multithreading task xamarin

因此,我在 Xamarin 中有一个监视器页面,其中我需要每秒刷新一次值(从 TcpClient 获取的值)。我在 CS 文件中设置了一个公共字符串,并在 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);
            }
        }
Run Code Online (Sandbox Code Playgroud)

然后我只是创建一个新线程来运行任务。就这样。问题是没有值更新到我的用户界面。当我尝试为任务外部的字符串赋值时,它工作正常。我确信我在这里遗漏了一些重要的东西,但我真的不知道是什么。

提前致谢

Dmi*_*iev 5

1)您的应用程序中是否使用了MVVM

2)如果是,那么您需要确保在您的中设置 DataContextView

3)在你的viewModel(VM)中,你需要从中创建属性myString

    private string _myString;
    public string MyString
    {
        get => _myString;
        set
        {
            _myString = value;
            NotifyPropertyChanged(() => MyString);
        }
    }
Run Code Online (Sandbox Code Playgroud)

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));

        }
    }
Run Code Online (Sandbox Code Playgroud)