C# WPF中的GridView动态列
我想使用GridView在WPF中显示一组数据。数据将包含信息,在哪些列中应显示该信息。这个班看起来是这样的: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; }
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;
}
}
}
任何帮助都会很好,非常感谢 看一看,它可能会给你一些想法。我尝试过使用依赖属性来显示显示文本。但是我仍然无法在正确的列中显示绑定的文本。我已经更新了我的问题。