在我的搜索中,这个问题的常见解决方案是在调用操作完成后添加一个事件处理程序来处理。
不幸的是,我的IValueConverter需要返回一个值,因此处理程序没有多大帮助。我还尝试了一个do / while循环,直到操作完成但循环从未关闭。
我也尝试过一个简单的等待操作,但它仍然返回null。我知道我的DomainService返回正确的值,但转换器永远不会看到它。
在这种情况下我能做些什么吗?有一个工作的转换器将删除/减少我可以预见的所有未来的问题。
我的代码:(我需要这样的东西有效)
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;
}
答案 0 :(得分:1)
(新答案,因为它与第一个完全不同!)
这假设你正在使用某种ViewModel datacontext模式...
您可以在ViewModel上创建第二个属性来保存转换后的值,而不是在IValueConverter
中执行此操作。
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时,名称将异步更新。您可能还需要在名称getter / setter中使用INotifyPropertyChanged
,如果您使用的是ViewModel,那么您已经熟悉了所有这些内容。
当您遇到异步调用时,也可能值得添加一些值旧的或不完整的UI指示符 - 我不知道您的设置是什么,但理论上客户机可能是在距离世界另一端28.8k的连接或非常慢的移动设备上,所以你的响应时间会很差。但这与手头的答案并不相关!
答案 1 :(得分:0)
你能不能同步调用它?
return context.GetName(id.ToString());
否则,你可能不得不等待.NET 4.5和async / await关键字,正如我所理解的那样(我自己还没有玩过)这会让你在你的方法中的某个地方放一个“等待”点而不是继续,直到异步部分完成。
但正如你所要求的那样,没有办法使异步调用的行为像同步调用一样。为什么需要异步?