0

在我搜索这个问题的常见解决方案是添加一个事件处理程序以在调用操作完成后进行处理。

不幸的是,我的 IValueConverter 需要返回一个值,因此拥有处理程序并没有多大帮助。我还尝试了一个 do/while 循环,直到操作完成但循环永远不会关闭。

我也尝试了一个简单的等待操作,但它仍然返回 null。我知道我的 DomainService 返回正确的值,但 Converter 永远看不到它。

在这种情况下我能做些什么吗?拥有一个可以工作的转换器将消除/减少我可以预见的几乎所有未来的问题。

我的代码:(我需要这样的东西)

    InspectDomainContext context = new InspectDomainContext();
    string name;
    InvokeOperation<string> inv;

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        string id = (string)value;
        inv = context.GetName(id);
        inv.Completed += new EventHandler(inv_Completed);
        // return here after the handler has completed
        return name;
    }

    void inv_Completed(object sender, EventArgs e)
    {
        name = inv.Value;
    }
4

2 回答 2

1

(新答案,因为它与第一个完全不同!)

这假设您正在使用某种 ViewModel 数据上下文模式......

IValueConverter您可以在 ViewModel 上创建第二个属性来保存转换后的值,而不是在 中执行此操作。

public class MyViewModel
{
    private string _id;
    public string Id
    {
        get { return _id; }
        set 
        { 
            _id = value; 
            UpdateConvertedName(_id);
        }
    }

    private void UpdateConvertedName(string id)
    {
        // Same as your 'Convert' code above
    }

    private void inv_Completed(object sender, EventArgs e)
    {
        Name = inv.Value;        
    } 

    public string Name { get; set; }
}

因此,您无需使用转换器绑定到 ID,而是直接绑定到 Name。每当更改 ID 时,名称都会异步更新。您可能还需要INotifyPropertyChangedName getter/setter 中的一些内容,如果您使用的是 ViewModels,您将已经熟悉所有这些。

由于您遇到了异步调用,因此还值得添加一些值旧或不完整的 UI 指示符 - 我不知道您的设置是什么,但理论上客户端计算机可能在 28.8k 连接上世界的另一端或非常慢的移动设备,因此您的响应时间会很差。但这与手头的答案并不相关!

于 2012-06-08T12:24:51.680 回答
0

您可以改为同步调用它吗?

return context.GetName(id.ToString());

否则,您可能必须等待 .NET 4.5 和 async/await 关键字,据我了解(我自己还没有玩过它),这将让您在方法中的某处放置一个“等待”点,直到异步部分已经完成。

但是,正如您所要求的那样,无法使异步调用表现得像同步调用一样。为什么需要异步?

于 2012-06-08T10:35:20.273 回答