Как объединить свойства элемента типа Object в C # - PullRequest
0 голосов
/ 04 октября 2018

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

screenshot

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

public class FabricanteFormResponse
{    
      [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; }

}

Логика такова: когда столбец принимает значение 2, это продукт, а когда столбец принимает значение 1, это идентификатор..

POSTMAN

затем, когда я открываю свою ViewModel, я создаю ObservableCollection Sqs и метод LoadSubstances (), который загружает список этого объекта типа Objectкогда столбец равен 2 с LINQ

#region Constructor
public ResultadosHDSViewModel()
 {  
    Sqss = new ObservableCollection<Sqs>();

    LoadSustancias();
 }
#endregion


#region Metodos           
 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()).ToList();

      Sqss.Clear();

      foreach (var item in sustancias)
      {
         foreach (var itemSqs in item)
         {
             if (itemSqs.Column == 2)
             {
               Sqss.Add(itemSqs);
              }
          }
      }         
}
#endregion

В моей Vista я занимаю следующие привязки

<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" 
                                       FontSize="Small" 
                                       TextColor="{StaticResource das.color.texto}"
                                       VerticalOptions="CenterAndExpand" />

                        </StackLayout>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

В качестве занимаемой ранее структуры данных я могу объединить идентификатор вместе с именем продукта?Могу ли я сделать это с помощью метода LoadSubstance?я должен создать новое свойство?

помощь для меня?

1 Ответ

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

Из списка Sqs списков получите соответствующий элемент

List<Sqs> item = Sqs[i];
string formattedString = $"({item[0].Value}) {item[1].Value}";
                                                    // e.g. "(2) 10-31 LIMPIADOR DE CONTACTOS"

, предполагая, что id и product всегда являются двумя первыми элементами.


Но это было бы оченьпроще, если вы создали класс Product и преобразовали необработанный список свойств Json в список продуктов

public class Product
{
    public Product()
    {
    }

    public Product(List<Sqs> properties)
    {
        Id = (int)properties[0].Value;
        Name = (string)properties[1].Value;
        Manufacturer = (string)properties[2].Value;
        Keywords = (string)properties[3].Value;
    }

    public int Id { get; set; }
    public string Name { get; set; }
    public string Manufacturer { get; set; }
    public string Keywords { get; set; }

    public string ProductText => $"({Id}) {Name}";

    public override string ToString() => ProductText;
}

Этот класс имеет свойство ProductText и переопределяет ToString, чтобы он мог создавать вашу отформатированную строку какжелаемый.

Заменить Sqss на Products

public ObservableCollection<Product> Products { get; set; }

Тогда вы можете просто создать список продуктов в LoadSustancias() с помощью

Products = new ObservableCollection<Product>(mainViewModel.FabricanteForm.Results.Sqs
    .Select(props => new Product(props))
);

Теперь вы можетепривязать ваш ListView к списку Products и привязать ярлык к <Label Text="{Binding ProductText}" ....

...