Как получить доступ к свойству объекта в списке в DataGrid в XAML - PullRequest
0 голосов
/ 02 октября 2018

Я долго искал, но думаю, что, может быть, я смотрю не в ту сторону.У меня есть DataGrid, где ItemsSource установлен в список Book объектов.В то же время объект Book содержит список объектов Chapter.

public class Book {
    public string Title;
    public List<Chapter> AvailableChapters;
}

public class Chapter {
    public int ChapterNumber;
    public int NumberOfPages;
}

Я использую их таким образом в DataGrid:

<DataGrid SelectionMode="Extended"
              HeadersVisibility="Column"
              CanUserAddRows="False">
    <DataGrid.Columns>
            <DataGridTextColumn Header="Title" Binding="{Binding Title}" />
            <DataGridTextColumn Header="Available chapters" Binding="{Binding AvailableChapters}" />
            <!-- This is what I tried
            <DataGridTemplateColumn Header="Available chapters">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <ListBox ItemsSource="{Binding AvailableChapters}" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>-->
    </DataGrid.Columns>
</DataGrid>

Моя цель состоит в том, чтобыпоказать список глав внутри книги в виде списка строк, где каждая строка является номером главы (свойство ChapterNumber).По этой причине я пытался каким-то образом получить доступ к свойству ChapterNumber в свойстве ChapterList.Пробовал использовать даже ListBox или AvailableChapters.ChapterNumber, но это не имеет смысла).

Пример:

enter image description here

Редактировать

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

public class ChapterListToStringListConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            List<Chapter> chapters = value as List<Chapter>;
            if (chapters == null)
            {
                chapters = new List<Chapter>();
            }

            Debug.Print(chapters.Count.ToString());    // "0"
            Debug.Print(chapters[0].ChapterNumber);    // Error: index out of range
            string result = string.Join(" ", chapters.Select(chap => chap.Name));
            return result;
        }
    }
}

Ответы [ 3 ]

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

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

Чтобы получить единственную строку со всеми доступными главами, просто добавьте вычисляемое свойство в свой класс Book., который объединяет все элементы главы из списка.

public class Book 
{
    public string Title {get; set;}
    public List<Chapter> AvailableChapters; {get;}

    public string AvailableChaptersDisplay
    { get {return string.Join( " ", AvailableChapters.Select( c => c.ChapterNumber )); } }
}
0 голосов
/ 02 октября 2018

В случае, если вы добавляете главы после инициализации представления, AvailableChapters должен быть ObservableCollection:

public class Book
{
    public string Title { get; set; }

    public ObservableCollection<Chapter> AvailableChapters { get; }
        = new ObservableCollection<Chapter>();
}

В вашем конвертере просто проверьте, является ли значение IEnumerable:

public object Convert(
    object value, Type targetType, object parameter, CultureInfo culture)
{
    var chapters = value as IEnumerable<Chapter>;

    return chapters == null
        ? "-"
        : string.Join(" ", chapters.Select(chap => chap.ChapterNumber));
}
0 голосов
/ 02 октября 2018

Вы можете добавить свойство, которое рассчитывает это для вас.

public class Book {
    public string Title;
    public List<Chapter> AvailableChapters;
    public string AvailableChaptersString
    {
        get {return list_concatenated_in_desired_format; }
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...