Я пытаюсь воспроизвести этот очень информативный руководство для реализации проверки с поведением Xamarin Forms для приложения Xamarin Forms. Учебное пособие основано на сценарии одной модели пользователя, тогда как мой случай основан на списке элементов. Я считаю, что моя логика проверки работает правильно, однако представление не меняется, чтобы указать на ошибки проверки: учебное пособие направлено на добавление красной границы и встроенных сообщений об ошибках проверки в поля, которые не были успешно проверены.
В учебнике проверка выполняется в команде, объявленной в конструкторе, а сообщения об ошибках просто задаются в свойствах модели. Это обновляет представление XAML, насколько я понимаю, благодаря привязке данных, реализованной в представлении. В моем случае я пытаюсь сделать то же самое, проверяя команду сохранения и обновляя значения в списке. Я также вижу, что фактический "ошибочный" объект редактируется в списке, но ExtendedEntry в представлении не обновляется красными рамками и сообщением об ошибке, как ожидалось. Я также попытался очистить ObservableCollection и перестроить его, добавляя по одному элементу за раз. У меня вопрос: почему мое решение не работает со списком элементов? Разве в этом случае не выдерживает логика?
Добавляем несколько фрагментов для справки ниже:
Учебное пособие использовалось для расширения компонента Entry и создания компонента ExtendedEntry, который принимает дополнительные свойства, такие как граница и встроенные сообщения проверки. По этой причине для каждой платформы были реализованы собственные средства визуализации. Также было создано поведение входа для обработки поведенческих изменений формы. Я не включаю их, так как предполагаю, что копирование и вставка их из ссылки не должны испортить код.
Модель включает в себя 2 поля проверки, одно для определения появления красной границы, другое для определения сообщения проверки.
public class MetaData: INotifyPropertyChanged
{
public string Name { get; set; }
public string Value { get; set; }
public string Type { get; set; }
public bool Mandatory { get; set; }
public bool IsNotValid { get; set; }
public string NotValidMessageError { get; set; }
public event PropertyChangedEventHandler PropertyChanged;
}
Конструктор ViewModel, который также содержит OnValidationCommand. Я не уверен, привязан ли глобальный список к представлению. Поэтому я попытался обновить список и коллекцию Observable один за другим.
public ObservableCollection<MetaData> Items { get; set; }
public List<MetaData> MetadataList { get; set; }
public ICommand OnValidationCommand { get; set; }
public MetadataPreviewViewModel(List<MetaData> md)
{
MetadataList = md;
OnValidationCommand = new Command((obj) =>
{
Items.Clear();
bool errorValidation = false;
for (int i = 0; i < MetadataList.Count; i++)
{
var item = MetadataList[i];
var tempItem = Validate(item);
MetadataList[i] = tempItem;
Items.Add(tempItem);
}
});
Title = "Metadata";
Items = new ObservableCollection<MetaData>();
LoadItemsCommand = new Command(async () => await ExecuteLoadItemsCommand());
}
public MetaData Validate(MetaData item)
{
int intType = Convert.ToInt16(item.Type);
switch (intType)
{
case (int)DefaultValueType.Custom_Date:
// need to validate date
item.IsNotValid = false;
break;
default: {
if (item.Mandatory)
{
if (item.Value != null && item.Value != "")
item.IsNotValid = false;
else
{
item.IsNotValid = true;
item.NotValidMessageError = item.Name + " is required.";
}
}
break;
}
}
return item;
}
В XAML я использую различные DataTemplate и DataTemplateSelector для включения разных макетов с разными компонентами в XAML. Я пока только пытался реализовать валидацию в этом шаблоне. Ниже приведено объявление DataTemplate в ResourceDictionary и разделе ContentPage.Content с объявлением ListView, также указывающим селектор шаблона. Обратите внимание, что селектор шаблонов работает правильно, и правильные шаблоны отображаются для различных сценариев.
<ResourceDictionary>
<DataTemplate x:Key = "textTemplate">
<ViewCell>
<Grid Padding = "8">
<Grid.ColumnDefinitions>
<ColumnDefinition Width = "0.4*" />
<ColumnDefinition Width = "0.6*" />
</Grid.ColumnDefinitions>
<Label Grid.Column = "0" Text = "{Binding Name}" HorizontalOptions = "Start"/>
<local1:ExtendedEntry Grid.Column = "1" ErrorText = "{Binding NotValidMessageError, Mode=TwoWay}"
BorderErrorColor = "Red"
Text = "{Binding Value, Mode=TwoWay}"
HeightRequest = "40"
IsBorderErrorVisible = "{Binding IsNotValid, Mode=TwoWay}" InputTransparent = "{Binding ROnly}">
<local1:ExtendedEntry.Behaviors>
<behavior:EmptyEntryValidationBehaviour />
</local1:ExtendedEntry.Behaviors>
</local1:ExtendedEntry>
</Grid>
</ViewCell>
</DataTemplate>
<local:MetaDataTemplateSelector x:Key = "metaDataTemplateSelector"
TextTemplate = "{StaticResource textTemplate}"
CheckboxTemplate = "{StaticResource checkboxTemplate}"
DatePickerTemplate = "{StaticResource datepickerTemplate}"
NumericTemplate = "{StaticResource numericTemplate}"/>
</ResourceDictionary>
</ContentPage.Resources>
<ContentPage.Content>
<StackLayout>
<ListView x:Name = "MetadataListView"
ItemsSource = "{Binding Items}"
ItemTemplate = "{StaticResource metaDataTemplateSelector}"
VerticalOptions = "FillAndExpand"
HasUnevenRows = "true"
RefreshCommand = "{Binding LoadItemsCommand}"
IsPullToRefreshEnabled = "true"
IsRefreshing = "{Binding IsBusy, Mode=TwoWay}"
CachingStrategy = "RecycleElement">
</ListView>
<Button Text = "Save" Command = "{Binding OnValidationCommand}"></Button>
</StackLayout>
</ContentPage.Content>





Вам действительно нужно уметь резюмировать свои вопросы. Я прочитал его по диагонали и не мог понять, о чем вы спрашиваете. Измените текстовую стену на что-нибудь менее плотное или просто повторите то, что вы пытались спросить.