Как показать свойство типа Object в списке - PullRequest
0 голосов
/ 03 октября 2018

Я хочу показать список химических веществ следующим образом

screenshoot

проблема в том, что, по моему мнению, я не показываючто угодно!

Когда я открываю свою ResultadosHDSViewModel, у меня есть следующий метод в конструкторе

  ObservableCollection<Sqs> sqss;   

  public ObservableCollection<Sqs> Sqss
  {
      get
   {
       return sqss;
   }
      set
      {
         if (sqss != value)
      {
          sqss = value;
          PropertyChanged?.Invoke(
                     this,
                     new PropertyChangedEventArgs(nameof(Sqss)));
       }
}
                }

         public ResultadosHDSViewModel()
         {           
                LoadSustancias();
         }

    public async void LoadSustancias()
    {                     

       var mainViewModel = MainViewModel.GetInstance();           

       var sustancias = mainViewModel.FabricanteForm.Results.Sqs.Select(c => c.Where(v => v.Column == 2)
                             .Select(u => u).ToList().FirstOrDefault());    

           foreach (var item in sustancias)
           {
                Sqss.Add(item); 
           }
    }

Результат моего запроса LINQ "sustancias":

debug

проблема заключается в том, что при прохождении этого Inumerable с помощью foreach для заполнения моей ObservableCollection Sqss мое приложение падает и лопается!

Я присоединяю свой вид, к которому я хочусохранить данные (Значение) ResultadosHDSView.XAML:

<StackLayout 
        BindingContext="{Binding ResultadosHDS}"
        Padding="5"> 

        <ListView ItemsSource="{Binding Sqss}"
                  SelectionMode="None">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <StackLayout Orientation="Horizontal" 
                                         VerticalOptions="CenterAndExpand" 
                                         Padding="16,0,0,0">
                            <Label Text="{Binding Value}" 
                                       HorizontalOptions="FillAndExpand"                                          
                                       VerticalOptions="CenterAndExpand" />
                            <Button 
                                    Text="VER"  
                                    HorizontalOptions="End"
                                    VerticalOptions="Center"                                   
                                    HeightRequest="35" 
                                    WidthRequest="55"
                                    Command="{Binding VerCommand}"/>
                            <Button 
                                    Text="HDS"   
                                    VerticalOptions="Center"                                        
                                    HeightRequest="35"
                                    WidthRequest="55"
                                    Command="{Binding HDSCommand}" />
                        </StackLayout>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

    </StackLayout>

Я также прикрепляю определение участвующих классов

 public class FabricanteFormResponse
    {
        [JsonProperty(PropertyName = "userMessage")]
        public string UserMessage { get; set; }

        [JsonProperty(PropertyName = "status")]
        public int Status { get; set; }

        [JsonProperty(PropertyName = "results")]
        public FabricanteForm Results { get; set; }
    }

public class FabricanteForm
    {
        [JsonProperty(PropertyName = "columns")]
        public List<int> Columns { get; set; }

        [JsonProperty(PropertyName = "sqs")]
        public List<List<Sqs>> Sqs { get; set; }
    }

 public class Sqs
    {
        [JsonProperty(PropertyName = "field")]
        public string Field { get; set;}

        [JsonProperty(PropertyName = "column")]
        public int Column { get; set; }

        [JsonProperty(PropertyName = "value")]
        public Object Value { get; set; }
    }

Как видите, мое свойство "Значение" объекта имеетвведите Object, это именно то, что я хочу показать в привязке моего представления!

Что я делаю не так?запрос типа Linq?Должен ли я разыграть свой предмет до того, как я его положу?как мне это сделать?любая помощь для меня?

1 Ответ

0 голосов
/ 03 октября 2018

Поскольку вы вызываете метод из конструктора, я бы заменил цикл foreach следующим образом:

Sqss = new ObservableCollection<Sqs>(sustancias);

Ваш LINQ также можно немного улучшить:

var sustancias = fabricanteForm.Sqs.Select(c => c.FirstOrDefault(v => v.Column == 2));

Поскольку выиспользование FirstOrDefault заставляет меня поверить, что могут быть элементы без столбца 2, поэтому, если вам нужны только те, которые не равны NULL:

Sqss = new ObservableCollection<Sqs>(sustancias.Where(s => s != null));

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

    private void LoadSustancias()
    {
...