2010-12-06 2 views
4

У меня есть страница с двумя элементами управления на ней, datagrid и форматом данных.Silverlight dataform currentitem issue

В datagrid у меня есть список всех объектов определенного класса. Когда пользователь выбирает элемент в datagrid, форма данных загружается выбранным объектом.

dataForm.CurrentItem = view.CurrentItem; view - это PagedCollectionView, который содержит только выбранный элемент.

Моя проблема заключается в том, что при установке свойства currenitem в dataform, если я использую только PagedCollectionView (представление) без .CurrentItem, я теряю валидацию в форме данных. Все необходимые поля не рассматриваются как требуемые. Если я использую pcv.CurrentItem, так как проверка данных CurrentItem моей формы данных прекрасна, но затем возникает другая проблема.

При использовании текущего элемента в PagedCollectionView в качестве текущего элемента в DataForm в:

пользователь выбирает элемент в сетке и объект загружается штраф в DataForm. Если пользователь изменяет определенное значение в любом из текстовых полей в форме данных, а затем выбирает другой элемент для загрузки формы данных, возникает следующая ошибка:

«Невозможно изменить валюту, когда элемент имеет ошибки проверки или он и AutoCommit имеет значение false. Установите ItemsSource в ICollectionView для управления валютой вместо этого. " Я не использую пейджинговые свойства формы данных, и у меня есть собственная кнопка сохранения в форме.

Буду признателен за любую помощь, это мой первый проект Silverlight, над которым я работаю.

Редактировать. Я использовал dataform.CommitEdit при изменении текущего элемента данных. Одна вещь, которую это не разрешило, - это если в форме есть ошибка проверки, возникает ошибка валюты. В любом случае, чтобы обойти это. AutoEdit является истинным, а AutoCommit является ложным для формы данных.

ответ

4

Трудно точно определить, что здесь происходит без образца, но вот наблюдение, которое может помочь решить проблему. Попробуйте вместо этого привязать свойство ItemsSource как DataGrid, так и DataForm к представлению коллекции, а не привязать свойство CurrentItem DataForm. Они волшебным образом синхронизируются (выбранный элемент в DataGrid будет устанавливать текущий элемент в DataForm) - это функция CollectionView. Это может или не может решить вашу проблему, но в любом случае это не повредит :).

Блатант самооценки: эта и другие функции CollectionView описаны в моей книге Pro Business Applications with Silverlight 4 :).

+0

Привет, Крис, спасибо за предложение. Я пробовал этот метод, и я все равно получаю ту же ошибку. – user531958 2010-12-06 09:13:33

1

У меня была эта проблема много раз. И всегда в случае добавления нового элемента. После нескольких разочаровывающих дней я загрузил исходники Silverlight toolkit. (Вы можете найти в каталоге Programles (Mine are is C: \ Program Files (x86) \ Microsoft SDK \ Silverlight \ v4.0 \ Toolkit \ Apr10 \ Source)) Компиляция и ссылка вместо сборки System.Windows. Controls.Data.DataForm.Toolkit

В режиме отладки мы видим странное поведение в DataForm.cs:

private static void OnCurrentItemPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
     { 
      DataForm dataForm = d as DataForm; 
      if (dataForm != null && !dataForm.AreHandlersSuspended()) 
      { 
       if (dataForm._lastItem != null && dataForm.ShouldValidateOnCurrencyChange) 
       { 
        dataForm.ValidateItem(); 
       } 

       if ((!dataForm.AutoCommitPreventsCurrentItemChange && dataForm.IsItemValid) && 
        (e.NewValue == null || 
        dataForm._collectionView == null || 
        dataForm._collectionView.Contains(dataForm.CurrentItem) 
        )) 
       { 
        dataForm.SetUpNewCurrentItem(); 
        dataForm.GenerateUI(true /* clearEntityErrors */, true /* swapOldAndNew */); 
        dataForm.UpdateCurrentItem(); 
        SetAllCanPropertiesAndUpdate(dataForm, false /* onlyUpdateStates */); 
        dataForm._lastItem = dataForm.CurrentItem; 
        dataForm.OnCurrentItemChanged(EventArgs.Empty); 
       } 
       else 
       { 
        dataForm.SetValueNoCallback(e.Property, e.OldValue); 
        throw new InvalidOperationException(string.Format(Globalization.CultureInfo.InvariantCulture, System.Windows.Controls.Data.DataForm.Toolkit.Resources.DataForm_CannotChangeCurrency, "AutoCommit", "ItemsSource", "ICollectionView")); 
       } 
      } 
     } 

dataForm._collectionView.Contains (DataForm.CurrentItem) возвращает ложь, даже тот же объект существует в dataForm._collectionView

Я изменил условное:

if ((!dataForm.AutoCommitPreventsCurrentItemChange && dataForm.IsItemValid) && 
        (e.NewValue == null || 
        dataForm._collectionView == null || 
        dataForm._collectionView.Contains(dataForm.CurrentItem) || 
        dataForm.CurrentItem == e.NewValue 
        )) 

И DataForm начал работать нормально. Без исключения и ошибок.

0
private void DataForm_EditEnding(object sender, DataFormEditEndingEventArgs e) 
{ 
    if (e.EditAction == DataFormEditAction.Commit) 
    { 
     ... 
    } 
    else 
    { 
     DataForm1.ValidationSummary.Errors.Clear(); 
    } 
} 
0

Проверьте, нет ли ошибок проверки, когда вы являетесь обязательными для текущего элемента, если у вас есть какое то очистить их BindingItem.ValidationErrors.Clear(); затем привяжите элемент к форме данных.