2012-06-08 3 views
0

В моем поиске принято решение об объединении обработчика событий после выполнения операции invoke.Проблемы с IValueConverter и asynch DomainService Invoke в C#

К сожалению, моему 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; 
    } 

ответ

1

(новый ответ, как это совершенно отличается от первого!)

Это предполагает, что вы используете какой-то ViewModel DataContext узор ...

Вместо этого в 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 с конвертером вы просто привязываетесь непосредственно к имени. При изменении идентификатора имя будет обновляться асинхронно. Вам также может понадобиться около INotifyPropertyChanged в устройстве getter/setter Name, если вы используете ViewModels, вы уже будете знакомы со всем этим.

Поскольку вы застряли в асинхронных вызовах, возможно, стоит добавить некоторые индикаторы пользовательского интерфейса, что значение старое или неполное - я не знаю, что такое ваша установка, но теоретически клиентская машина может быть на 28,8 k с другой стороны мира или очень медленным мобильным устройством, поэтому ваше время отклика будет очень низким. Но это не очень важно для ответа!

+0

Ничего себе, отличный ответ! Я не думал использовать ViewModel, но это имеет смысл. – xhedgepigx

+0

Фу, я рад, что вы используете ViewModel, или это были бы два ответа дерьма! Надеюсь, это поможет вам получить то, что вам нужно. –

0

Не могли бы вы назвать это синхронно, а?

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

В противном случае, вы, вероятно, придется ждать .NET 4.5 и в асинхронном/ждут ключевых слов, как я понимаю (не играл с ним еще сам), это позволит вам поставить точку «ждать» где-то в ваш метод не будет продолжаться до тех пор, пока не закончится асинхронная часть.

Но нет никакого способа заставить асинхронный вызов вести себя как синхронный, как вы просите. Почему он должен быть асинхронным?

+0

это LINQ для сущностей, так что это автоматически асинхронно. Я не слишком уверен, как я мог бы сделать это синхронно, как любой вызов класса службы домена asynch, это мое понимание этого в любом случае, возможно, я ошибаюсь. – xhedgepigx

+0

Использует ли это службы WCF RIA? –