список привязки данных в списке, uwp + xaml - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть следующая модель:

public class TableData
{
    [JsonProperty(PropertyName = "objectsDetected")]
    public List<ObjectsDetected> ObjectsDetected { get; set; }

    [JsonProperty(PropertyName = "file_name_at_upload")]
    public int File_Name_At_Upload { get; set; }
}

public class ObjectsDetected
{
    [JsonProperty(PropertyName = "className")]
    public string className { get; set; }

    [JsonProperty(PropertyName = "score")]
    public double score { get; set; }
}

Я получаю свои данные от вызова API:

        var request = (HttpWebRequest)WebRequest.Create("http://localhost:58941/api/data");
        request.Method = "GET";
        request.ContentType = "application/json";
        WebResponse response = await request.GetResponseAsync();

        if (response != null)
        {
            string responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();

            List<TableData> myDeserializedObjList = (List<TableData>)JsonConvert.DeserializeObject(responseString, typeof(List<TableData>));
            cosmosData.ItemsSource = myDeserializedObjList;

        }

Это код XAML:

    <StackPanel>
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="200"/>
                <ColumnDefinition Width="200"/>
            </Grid.ColumnDefinitions>

            <TextBlock Grid.Column="0" Text="Navn på billede" Foreground="Black" FontSize="20" FontWeight="Bold"/>
            <TextBlock Grid.Column="2" Text="Kategori fundet" Foreground="Black" FontSize="20" FontWeight="Bold"/>
        </Grid>
            <GridView x:Name="cosmosData"
                      ItemClick="cosmosData_ItemClick"
                      IsItemClickEnabled="True"
                      IsSwipeEnabled="true"
                      SelectionMode="Single">
                <GridView.ItemTemplate>
                <DataTemplate x:DataType="local:TableData">
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="200"/>
                            <ColumnDefinition Width="200"/>
                        </Grid.ColumnDefinitions>

                        <TextBlock Grid.Column="0" Text="{x:Bind File_Name_At_Upload}" />
                        <TextBlock Grid.Column="2" Text="{x:Bind ObjectsDetected.className}"/>

                    </Grid>
                </DataTemplate>

            </GridView.ItemTemplate>
            </GridView>
    </StackPanel>

Я хочу отобразить в пользовательском интерфейсе TableData и ObjectsDetected.classname в той же таблице, но я не могу получить доступ к ObjectsDetected.classname? Как я могу достичь этого?

1 Ответ

0 голосов
/ 02 мая 2018

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

<GridView x:Name="cosmosData" ItemClick="cosmosData_ItemClick" IsItemClickEnabled="True" IsSwipeEnabled="true" SelectionMode="Single">
<GridView.ItemTemplate>
    <DataTemplate x:DataType="local:TableData">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="200"/>
                <ColumnDefinition Width="200"/>
            </Grid.ColumnDefinitions>
            <TextBlock Grid.Column="0" Text="{x:Bind File_Name_At_Upload}" />
            <ItemsControl Grid.Column="1" ItemsSource="{x:Bind ObjectsDetected}">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding className}"/>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
        </Grid>
    </DataTemplate>
</GridView.ItemTemplate>

В качестве альтернативы вы можете добавить другое свойство в модель TableData, например:

public class TableData
{
    [JsonProperty(PropertyName = "objectsDetected")]
    public List<ObjectsDetected> ObjectsDetected { get; set; }

    [JsonProperty(PropertyName = "file_name_at_upload")]
    public int File_Name_At_Upload { get; set; }

    [JsonIgnore]
    public string ClassNames => String.Join(",", ObjectsDetected.Select(o => o.className));
}

А затем в исходном коде свяжите вместо этого свойство ClassNames. (Это объединит значения через запятую, но вы можете использовать \n вместо ,, чтобы поместить каждое в свою строку). Вам также необходимо установить TextWrapping в TextBlock

...