Проблема с данными в Silverlight - PullRequest
4 голосов
/ 06 декабря 2010

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

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

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

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

Когда я использую текущий элемент PagedCollectionView в качестве текущего элемента формы данных:

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

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

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

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

Ответы [ 4 ]

4 голосов
/ 06 декабря 2010

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

1 голос
/ 07 декабря 2012

У меня была эта проблема много раз. И всегда в случае добавления нового товара. После нескольких разочаровывающих дней я скачал исходные коды Silverlight toolkit . (Вы можете найти в каталоге «Program Files» («Мои файлы» - это C: \ Program Files (x86) \ Microsoft SDKs \ 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) возвращает false, даже если тот же объект существует в dataForm._collectionView

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

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

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

0 голосов
/ 06 сентября 2013

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

0 голосов
/ 27 июня 2013
private void DataForm_EditEnding(object sender, DataFormEditEndingEventArgs e)
{
    if (e.EditAction == DataFormEditAction.Commit)
    {
        ...
    }
    else
    {
        DataForm1.ValidationSummary.Errors.Clear();
    }
}
...