【问题标题】:how to bind async method in PropertyChangedCallback of dependency property?如何在依赖属性的 PropertyChangedCallback 中绑定异步方法?
【发布时间】:2019-06-24 09:35:59
【问题描述】:

我需要从依赖属性的 PropertyChangedCallback 调用异步方法。

我的依赖属性:

public static readonly DependencyProperty SetTextProperty =
     DependencyProperty.Register("SetText",
typeof(string),
typeof(UserControl1),
new PropertyMetadata("",
new PropertyChangedCallback(OnSetTextChanged)));
    private async Task OnSetTextChanged()
    {
        //// My implementations.
    }

【问题讨论】:

  • 有什么问题?你得到什么错误?你需要更具体一点。
  • @iSpain17 显示错误的返回类型错误。

标签: c# wpf dependency-properties


【解决方案1】:

您的方法签名不正确。 PropertyChangedCallback 的构造函数需要一个返回类型为void 的委托,并且需要两个参数:

public delegate void PropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)

您可以将回调标记为异步,但它必须是 async void 并且需要两个参数作为输入(即使您根本不使用这些参数):

private async void OnSetTextChanged(DependencyObject d, 
DependencyPropertyChangedEventArgs e)
{
    await SomeMethod();
    // other stuff
} 

【讨论】:

  • 我需要返回 Task 而不是 void
  • 这是不可能的。该参数需要一个 PropertyChangedCallback,您可以在上面看到该回调的签名。或者在这里:docs.microsoft.com/hu-hu/uwp/api/… 为什么需要返回一个任务?
  • 还有其他方法可以将异步方法与依赖属性绑定吗?我需要通过依赖属性调用异步方法。
  • 你可以在回调中调用异步方法,用 await MethodName()
  • async void 方法是异步的,被添加到 C# 中专门用作事件处理程序方法。为此添加代码检查规则。
【解决方案2】:
public static readonly DependencyProperty MytextDependencyProperty =
            DependencyProperty.Register("MyText", typeof(string), typeof(TestClass), new PropertyMetadata(null, PropertyChangedCallbackAsync));

    private static async void PropertyChangedCallbackAsync(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        await someMethod();
    }

static async void,对我有用。

【讨论】:

    猜你喜欢
    • 2013-05-25
    • 2020-05-27
    • 1970-01-01
    • 2019-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    • 1970-01-01
    相关资源
    最近更新 更多