【问题标题】:Binding a label.Text to a String that gets updated from async task in Xamarin将 label.Text 绑定到从 Xamarin 中的异步任务更新的字符串
【发布时间】:2018-12-16 23:36:27
【问题描述】:

所以我在 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);
            }
        }

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

提前致谢

【问题讨论】:

  • 在ui/主线程上更新myString
  • 您的 myString 设置器是否在调用 PropertyChanged()?

标签: c# multithreading xamarin binding task


【解决方案1】:

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

2) 如果是,请确保在 View 中设置 DataContext

3) 在您的 viewModel(VM) 中,您需要来自 myString 的 make 属性

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

        }
    }

【讨论】:

  • 谢谢,将更新添加到 UI 线程并通过添加 PropertyChanged 调整我的 Setter 完成了这项工作!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-02
  • 1970-01-01
  • 2017-09-30
  • 2015-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多