C# WPF中的GridView动态列

C# WPF中的GridView动态列,c#,wpf,gridview,dynamic,C#,Wpf,Gridview,Dynamic,我想使用GridView在WPF中显示一组数据。数据将包含信息,在哪些列中应显示该信息。这个班看起来是这样的: public class RowViewModel : ViewModelBase { public string RowName { get; set; } public object CellObject { get; set; } public int ColumnIndex { get; set; }

我想使用GridView在WPF中显示一组数据。数据将包含信息,在哪些列中应显示该信息。这个班看起来是这样的:

    public class RowViewModel : ViewModelBase
    {
        public string RowName { get; set; }
        public object CellObject { get; set; }
        public int ColumnIndex { get; set; }
        public string ColumnHeader { get; set; }
        public string CellText { get; set; }
    }
            Column1 Column2 Columns3    ...   ColumnN      NewColumn
    Row1    Text1
    Row2                                        Text2
    Row3                    Text3
    Row4            Text4
    ...
    NewRow                                                  NewText
这意味着,我有一些行,但我不知道我有多少列。我无法在GridView中绑定RowViewModel中的属性,因为显示文本的列总是不同的

GridView应该如下所示:

    public class RowViewModel : ViewModelBase
    {
        public string RowName { get; set; }
        public object CellObject { get; set; }
        public int ColumnIndex { get; set; }
        public string ColumnHeader { get; set; }
        public string CellText { get; set; }
    }
            Column1 Column2 Columns3    ...   ColumnN      NewColumn
    Row1    Text1
    Row2                                        Text2
    Row3                    Text3
    Row4            Text4
    ...
    NewRow                                                  NewText
如果第5行的ColumnIndex大于ColumnN,则应添加一个新列

如何实现GridView以动态显示RowViewModels

我曾尝试将所有行转换为标准格式以满足GridView的要求,但如果我想在初始化GridView后添加一个具有新ColumnIndex的行,这将是不好的

我尝试使用依赖属性。但是我无法在正确的列中显示带有绑定的文本

    public static class RadGridViewDependencyProperties
    {
        #region ConfigurableColumns
        //RadGridView.Columns ist readonly
        public static readonly DependencyProperty ConfigurableColumnsProperty =
            DependencyProperty.RegisterAttached(
                "ConfigurableColumns",
                typeof(object),
                typeof(RadGridViewDependencyProperties),
                new PropertyMetadata(null, ConfigurableColumnsPropertyChangedCallback));

        private static void ConfigurableColumnsPropertyChangedCallback(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs)
        {
            var radGridView = dependencyObject as RadGridView;
            var gridViewColumnCollection = radGridView == null ? null : dependencyPropertyChangedEventArgs.NewValue as GridViewColumnCollection;
            if (gridViewColumnCollection == null)
            {
                return;
            }
            radGridView.Columns.Clear();
            radGridView.Columns.AddRange(gridViewColumnCollection);
        }

        public static void SetConfigurableColumns(DependencyObject dependencyObject, object value)
        {
            var radGridView = dependencyObject as RadGridView;
            var columns = radGridView == null ? null : value as GridViewColumnCollection;
            if (columns == null)
            {
                return;
            }
            radGridView.SetValue(ConfigurableColumnsProperty, columns);
        }

        public static GridViewColumnCollection GetConfigurableColumns(DependencyObject dependencyObject)
        {
            var radGridView = dependencyObject as RadGridView;
            return radGridView == null ? null : (GridViewColumnCollection)radGridView.GetValue(ConfigurableColumnsProperty);
        }
        #endregion
    }
我使用了一个配置程序初始化列:

    public class GridViewDataColumnConfigurator
    {
        private readonly GridViewColumnCollection _columns;
        private readonly ObservableCollection<RowViewModel> _rowViewModelCollection;

        public GridViewDataColumnConfigurator(ObservableCollection<RowViewModel> rowViewModelCollection)
        {
            _columns = new GridViewColumnCollection();
            _rowViewModelCollection = rowViewModelCollection;
        }

        public GridViewColumnCollection Columns
        {
            get
            {
                _columns.Clear();
                var firstRow = _rowViewModelCollection != null ? _rowViewModelCollection.FirstOrDefault() : null;
                if (firstRow != null)
                {
                    var gridViewDataColumn = new GridViewDataColumn
                    {
                        IsVisible = true,
                        IsReadOnly = true,
                        Header = "",
                        DataMemberBinding = new Binding("RowName")
                    };
                    _columns.Add(gridViewDataColumn);
                }
                else
                {
                    return _columns;
                }
                foreach (var rowViewModel in _rowViewModelCollection)
                {
                    if (_columns[rowViewModel.ColumnHeader] == null)
                    {
                        var gridViewDataColumn = new GridViewDataColumn
                        {
                            IsVisible = true,
                            DisplayIndex = rowViewModel.ColumnIndex,
                            UniqueName = rowViewModel.ColumnHeader,
                            Header = rowViewModel.ColumnHeader
                        };
                        gridViewDataColumn.DataMemberBinding = new Binding(".")
                        {
                            Mode = BindingMode.TwoWay,
                            UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged,
                            Converter = new RowViewModelCellTextConverter(),
                            ConverterParameter = gridViewDataColumn.DisplayIndex
                        };
                        gridViewDataColumn.IsReadOnlyBinding = new Binding(".")
                        {
                            Mode = BindingMode.OneWay,
                            Converter = new RowViewModelCellReadOnlyConverter(),
                            ConverterParameter = gridViewDataColumn.DisplayIndex
                        };
                        _columns.Add(gridViewDataColumn);
                    }
                }
                return _columns;
            }
        }

        public class RowViewModelCellTextConverter : IValueConverter
        {
            public object Convert(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                if (!(value is RowViewModel) || !(parameter is int))
                {
                    return null;
                }
                var rowViewModel = value as RowViewModel;
                return rowViewModel.ColumnIndex == (int)parameter ? rowViewModel.CellText : null;
            }

            public object ConvertBack(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                return value;
            }
        }

        public class RowViewModelCellReadOnlyConverter : IValueConverter
        {
            public object Convert(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                if (!(value is RowViewModel) || !(parameter is int))
                {
                    return null;
                }
                var rowViewModel = value as RowViewModel;
                return rowViewModel.ColumnIndex != (int)parameter;
            }

            public object ConvertBack(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                return null;
            }
        }

    }
公共类GridViewDataColumnConfigurator
{
私有只读GridViewColumnCollection\u列;
私有只读ObservableCollection_rowViewModelCollection;
公共GridViewDataColumnConfigurator(ObservableCollection行ViewModelCollection)
{
_columns=新的GridViewColumnCollection();
_rowViewModelCollection=rowViewModelCollection;
}
公共GridViewColumnCollection列
{
得到
{
_columns.Clear();
var firstRow=\u rowViewModelCollection!=null?\u rowViewModelCollection.FirstOrDefault():null;
如果(第一行!=null)
{
var gridViewDataColumn=新的gridViewDataColumn
{
IsVisible=true,
IsReadOnly=true,
标题=”,
DataMemberBinding=新绑定(“行名”)
};
_columns.Add(gridViewDataColumn);
}
其他的
{
返回_列;
}
foreach(在_rowViewModelCollection中的变量rowViewModel)
{
if(_列[rowViewModel.ColumnHeader]==null)
{
var gridViewDataColumn=新的gridViewDataColumn
{
IsVisible=true,
DisplayIndex=rowViewModel.ColumnIndex,
UniqueName=rowViewModel.ColumnHeader,
Header=rowViewModel.ColumnHeader
};
gridViewDataColumn.DataMemberBinding=新绑定(“.”)
{
Mode=BindingMode.TwoWay,
UpdateSourceTrigger=UpdateSourceTrigger.PropertyChanged,
Converter=新建行ViewModelCellTextConverter(),
ConverterParameter=gridViewDataColumn.DisplayIndex
};
gridViewDataColumn.IsReadOnlyBinding=新绑定(“.”)
{
Mode=BindingMode.OneWay,
Converter=新的RowViewModelCellReadOnlyConverter(),
ConverterParameter=gridViewDataColumn.DisplayIndex
};
_columns.Add(gridViewDataColumn);
}
}
返回_列;
}
}
公共类RowViewModelCellTextConverter:IValueConverter
{
公共对象转换(对象值、System.Type targetType、对象参数、System.Globalization.CultureInfo区域性)
{
如果(!(值为RowViewModel)| |!(参数为int))
{
返回null;
}
var rowViewModel=作为rowViewModel的值;
返回rowViewModel.ColumnIndex==(int)参数?rowViewModel.CellText:空;
}
公共对象转换回(对象值、System.Type targetType、对象参数、System.Globalization.CultureInfo区域性)
{
返回值;
}
}
公共类RowViewModelCellReadOnlyConverter:IValueConverter
{
公共对象转换(对象值、System.Type targetType、对象参数、System.Globalization.CultureInfo区域性)
{
如果(!(值为RowViewModel)| |!(参数为int))
{
返回null;
}
var rowViewModel=作为rowViewModel的值;
返回rowViewModel.ColumnIndex!=(int)参数;
}
公共对象转换回(对象值、System.Type targetType、对象参数、System.Globalization.CultureInfo区域性)
{
返回null;
}
}
}

任何帮助都会很好,非常感谢

看一看,它可能会给你一些想法。我尝试过使用依赖属性来显示显示文本。但是我仍然无法在正确的列中显示绑定的文本。我已经更新了我的问题。