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 に 2 番目のプロパティを作成して、変換された値を保持できます。

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 が変更されるたびに、Name は非同期で更新されます。INotifyPropertyChangedViewModels を使用している場合は、名前の getter/setter にもいくつか必要になる場合があります。

非同期呼び出しに固執しているため、値が古いか不完全であることを示す UI インジケーターを追加する価値があるかもしれません。セットアップが何であるかはわかりませんが、理論的には、クライアント マシンは地球の反対側または非常に遅いモバイル デバイスの場合、応答時間が非常に遅くなります。しかし、それは手元の答えとはあまり関係ありません!

于 2012-06-08T12:24:51.680 に答える
0

代わりに同期的に呼び出すことができますか?

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

それ以外の場合は、おそらく .NET 4.5 と async/await キーワードを待つ必要があります。私が理解しているように (まだ自分でプレイしていません)、メソッドのどこかに「待機」ポイントを配置して、非同期部分が終了しました。

しかし、あなたが求めているように、非同期呼び出しを同期呼び出しのように動作させる方法はありません。なぜ非同期にする必要があるのですか?

于 2012-06-08T10:35:20.273 に答える