【问题标题】:Update textblock to value of variable in WPF将文本块更新为 WPF 中变量的值
【发布时间】:2017-07-25 11:04:09
【问题描述】:

编辑:我想将文本块的值更新为在另一个类上定期生成的随机变量的值。

我的实现阻止了应用程序中的其他功能(按钮)。有什么建议吗?

   public partial class MainWindow : Window
{
    TaskViewModel viewModel = new TaskViewModel();

    public MainWindow()
    {
        this.DataContext = viewModel;
        InitializeComponent();
        Server_V2.AsyncService.runMain();
        DisplayAV();
    }

    //Display Availability
    private async void DisplayAV() {
        while (true) {
            //availabilityField.Text = Server_V2.AV.ToString();
            viewModel.Availability = Server_V2.AV.ToString();
            await Task.Delay(500);
        }
    }

    public class TaskViewModel : INotifyPropertyChanged
    {
        private string availabilty = "0";
        public string Availability
        {
            get { return availabilty; }
            set { availabilty = value; OnStaticPropertyChanged();}
        }
        public event PropertyChangedEventHandler PropertyChanged;
        public void OnStaticPropertyChanged([CallerMemberName] string PropertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(PropertyName));
        }
    }

【问题讨论】:

  • 您应该将您尝试过的内容(代码)添加到答案中。即使它没有运行。不付出努力,你将得不到社区的帮助。
  • 我可以看看你尝试了什么吗?您还指的是哪些其他实现?你能告诉我这个类以及你如何访问变量吗?您是否正在使用事件,因为它会定期更新?也许是一个计时器?
  • 如果 AV 是 Server_V2 类中的静态属性,请遵循此答案中给出的说明:stackoverflow.com/a/34763286/1136211
  • 请添加您混淆的代码。
  • @Clemens 谢谢。这有很大帮助。我仍然遇到问题,因为文本块阻止了应用程序中的其他操作。 (见上面的代码)

标签: c# .net wpf binding


【解决方案1】:

您应该使用后台工作人员。你的异步代码仍然在主线程上运行。

像这样……

    BackgroundWorker worker = new BackgroundWorker();
    public MainWindow()
    {
        this.DataContext = viewModel;
        InitializeComponent();
        Server_V2.AsyncService.runMain();
        worker.DoWork += Worker_DoWork;
        worker.RunWorkerAsync();
    }

    private void Worker_DoWork(object sender, DoWorkEventArgs e)
    {
        while (true)
        {
            //availabilityField.Text = Server_V2.AV.ToString();
            viewModel.Availability = Server_V2.AV.ToString();
            Thread.Sleep(500);
        }
    }

【讨论】:

  • 谢谢!这行得通。我知道我应该在与 UI 元素的所有交互中使用后台工作人员,但是后台工作人员和任务之间在处理方面的主要区别是什么?
  • 来自这篇文章docs.microsoft.com/en-us/dotnet/csharp/programming-guide/…:“async 和 await 关键字不会导致创建额外的线程。异步方法不需要多线程,因为异步方法不会在自己的线程上运行。” Async/await 是一种编写代码的方式。您的问题需要另一个线程,这是后台工作人员所做的。
猜你喜欢
  • 2015-03-03
  • 1970-01-01
  • 1970-01-01
  • 2012-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-25
  • 1970-01-01
相关资源
最近更新 更多