0

我正在制作一个数据可视化应用程序,我已经用 XAML 编写了 3 个列并成功绑定,但我试图让用户在运行时添加列。

我正在尝试将列标题绑定到 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();
        }

listView.View 的 XAML 代码

<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 中使用的类的摘录,以及我想在绑定过程中使用的 List


    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;}

我仍在寻找 Header 绑定虽然

4

1 回答 1

0

有几种方法可以为您的行视图模型( rowvm )做这种事情。

如果您不需要来自视图模型的更改通知,那么您可以使用扩展对象。这允许您动态添加属性。

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

您也可以将依赖对象用作 rowvm。

然后,您可以动态添加附加的依赖项属性。 动态创建附加属性

这些将通知更改。

如果你特别想要一个普通的类作为 rowvm,那么你可以使用 wpf 博士的 observabledictionary:

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

然后,您可以通过向您的 observabledictionary 添加一个键值对来为每个列添加一个列。

使用名称绑定。

您当然需要迭代整个 rowvm 集合以添加给定列的键值对。

另一种选择是使用 ICustomTypeProvider 动态构建 rowvm。 https://www.c-sharpcorner.com/article/wpf-data-binding-with-icustomtypeprovider/

于 2019-05-21T14:30:54.170 回答