WPF Как добавить столбцы, связанные с элементами массива, используя GridViewColumns (привязка ListView) - PullRequest
0 голосов
/ 21 мая 2019

Я создаю приложение для визуализации данных, и у меня уже есть 3 столбца, написанных на XAML и успешно связанных, но я пытаюсь разрешить пользователям добавлять столбцы во время выполнения.

Я пытаюсь привязать заголовок столбца к значению, введенному в TextBox, который входит в класс, реализующий INotifyPropertyChanged, а значение ячейки - к элементу в списке, представленном в списке объектов в DataContext.

Если это пригодится, я на .NET 4.7.2

рассматриваемый класс:

    public class ColumnDescriptor : INotifyPropertyChanged
    {

        private string nom;

        public event PropertyChangedEventHandler PropertyChanged;

        public string Nom
        {
            get
            {
                return nom;
            }
            set
            {
                nom = value;
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Nom)));
            }
        }

(неудачное) связывание Я пытался использовать конвертер, но он не вызывался

private void NewColumnEvent_Handler(ColumnDescriptor columnDescriptor, int columnIndex)
        {

            Binding b = new Binding("Columns[0]")
            {
                Converter = new NumberToColumnConverter(),
                ConverterParameter = columnIndex.ToString(),
                Mode = BindingMode.OneWay
            };

            GridViewColumn gridViewColumn = new GridViewColumn
            {
                Header = "Name",
                DisplayMemberBinding = b
            };
            mainWindow.lvGridView.Columns.Add(gridViewColumn);
            UpdateListViewDataContext();
        }

XAML-код listView.View

<ListView.View>
                <GridView x:Name="lvGridView">
                    <GridViewColumn Header="Id" Width="125">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding Id}" Foreground="{Binding MessageColor}"/>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    <GridViewColumn Header="Titre" Width="200">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding Titre}"/>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    <GridViewColumn Header="XPath_Resultat" Width="262">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding XPath_Resultat}"/>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                </GridView>
            </ListView.View>

это фрагмент класса, используемого в DataContext, со списком, который я хочу использовать в процессе привязки


    class DataToBind
    {

        public List<string> Columns{get;set;}
    }

Я получаю эту ошибку при добавлении строк в просмотр списка

System.Windows.Data Error: 40 : BindingExpression path error: 'Columns' property not found on 'object' ''DataToBind' (HashCode=5641212)'. BindingExpression:Path=Columns[0]; DataItem='DataToBind' (HashCode=5641212); target element is 'TextBlock' (Name=''); target property is 'Text' (type 'String')

Любая помощь будет принята с благодарностью

РЕДАКТИРОВАТЬ: привязка была исправлена ​​путем изменения переменной в свойство ->

public List<string> Columns{get;set;}

Я все еще ищу привязку Заголовок, хотя

1 Ответ

0 голосов
/ 21 мая 2019

Есть несколько способов сделать такую ​​вещь для вашей модели представления строки (rowvm).

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

https://docs.microsoft.com/en-us/dotnet/api/system.dynamic.expandoobject?view=netframework-4.8

В качестве альтернативы вы можете использовать объект зависимости в качестве rowvm.

Затем вы можете динамически добавлять присоединенные свойства зависимостей. Создание вложенного свойства динамически

Они будут уведомлять об изменениях.

Если вы особенно хотите использовать простой класс в качестве rowvm, то вы можете использовать observabledictionary др wpf:

http://drwpf.com/blog/2007/09/16/can-i-bind-my-itemscontrol-to-a-dictionary/

Затем вы можете добавить столбец к каждому, добавив пару значений ключа в ваш наблюдаемый словарь.

Привязка с использованием имени.

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

Другим вариантом является динамическое создание rowvm с использованием ICustomTypeProvider. https://www.c -sharpcorner.com / статьи / МОФ-данных связывания-с icustomtypeprovider /

...