在异步方法中提升OnPropertyChanged

时间:2017-11-14 19:42:23

标签: c# wpf async-await inotifypropertychanged

在我的WPF应用程序中,我的视图模型中有一个方法

  • 应该异步运行
  • 从" Connect"更改按钮的内容到"取消"到"取消"取决于是否已取消取消。

取消本身正在运行,但按钮的内容未更新。 这是我的代码的摘录:

public async void Execute(object parameter)
{
    if (cts == null)
    {
        cts = new CancellationTokenSource();
        OnPropertyChanged(nameof(Name));
        await ConnectDevice(self.CurrentScannedDevice, cts.Token);
        cts = null;
        OnPropertyChanged(nameof(Name));
    }
    else
    {
        cts.Cancel();
        OnPropertyChanged(nameof(Name));
    }
 }
private CancellationTokenSource cts;

public string Name { get // bound to the content of the button
    {
        return cts == null
            ? "Connect Device"
            : cts.IsCancellationRequested
                ? "Cancelling Connecting To Device"
                : "Cancel Connecting To Device";
    }
}
private async Task ConnectDevice(object currentScannedDevice, CancellationToken ct)
{
  //...
}

XAML

<Button
    HorizontalAlignment="Left"
    Command="{Binding Path=ScanCommand}"
    Content="{Binding Path=Name}" />

1 个答案:

答案 0 :(得分:0)

我找到了原因。

在&#34;真实&#34;代码,Execute方法存在于命令类ScanCommandImpl中。此ICommand类的属性如下所示:

 public ICommand ScanCommand => new ScanCommandImpl();

它以某种方式重新创建了ScanCommandImpl,因此cts的变量一直在改变。

从构造函数初始化它修复了问题。