Как сделать так, чтобы Silverlight перехватывал исключение ValidationException в обратном вызове wcf / domain - PullRequest
0 голосов
/ 09 марта 2012

[Хорошо, во-первых, это не проблема с запуском в режиме отладки, когда VS перехватывает исключение ValidationException.Такое поведение наблюдается при запуске без отладки с помощью Ctrl-F5]

с использованием VS2010, SL4, служба домена Ria, сетка данных.Источник элементов сетки данных связан с коллекцией объектов (не сущностей).Одним из свойств элементов (UxBillingLineItem) в этой коллекции является объект, который извлекается с использованием службы домена ria.У меня есть текстовое поле для ввода значения ключа для этого свойства (ItemCode) вместе с кнопкой для всплывающего списка для выбора ItemCode.

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

ValidationException работаетотлично в других установщиках, где обратный вызов не задействован.

<sdk:DataGridTextColumn  Header="Charge Type"  Binding="{Binding Path=ItemCode, Mode=TwoWay,NotifyOnValidationError=True,ValidatesOnExceptions=True}"   />

Код свойства UxBillingLineItem:

private Avgm.Model.ItemCodeInfo _ChargeItemCode;
public Avgm.Model.ItemCodeInfo ChargeItemCode
{
  get { return _ChargeItemCode; }
  set
  {
    if (_ChargeItemCode != value)
    {
      _ChargeItemCode = value; this.RaisePropertyChanged(i => i.ChargeItemCode); this.RaisePropertyChanged(i => i.ItemCode);
    }
  }
}

public string ItemCode
{
  get { return ChargeItemCode == null ? string.Empty : ChargeItemCode.ItemCode; }
  set
  {
    if (ChargeItemCode != null && ChargeItemCode.ItemCode != value)
    {
      PSDomainContext psContext = new PSDomainContext();
      psContext.Load(psContext.GetItemCodeInfoByItemCodeQuery(value)).Completed += new EventHandler(ItemCodeLookup_Completed);
    }
  }
}

void ItemCodeLookup_Completed(object sender, EventArgs e)
{
  Atlas.Avgm.Model.ItemCodeInfo result = (sender as LoadOperation<Atlas.Avgm.Model.ItemCodeInfo>).Entities.FirstOrDefault();
  if (result != null)
  {
    ChargeItemCode = result;
    this.RaisePropertyChanged(i => i.ItemCode);
    this.RaisePropertyChanged(i => i.ChargeItemCode);
  }
  else
  {
    throw new ValidationException("Invalid Item Code");
  }
}

Похоже, я должен пропустить что-то очевидное ... Спасибо!

...