WPF的Datagrid绑定的自定义列标题

编程入门 行业动态 更新时间:2024-10-22 19:26:09
本文介绍了WPF的Datagrid绑定的自定义列标题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我试图找出如何在WPF DataGrid的列标题和主数据绑定到使用MVVM模式的数据源。我在寻找的结果是这样的:

I am trying to figure out how to bind a WPF DataGrid's column header and main data to a data source using an MVVM pattern. The result I'm looking for would look like this:

我已经成功地风格的头在这里,但我不能确定如何将值绑定的头。具体来说,该复选框的财产器isChecked,组合框的选定索引和文本框的值。

I've successfully styled the headers here, but I'm unsure how to bind the values in the headers. Specifically, the IsChecked property of the check-box, the selected index of the combo box and the value of the text box.

我是previously使用一个简单的数据表来填充主网的数据,但我会需要更复杂的东西保留两个电网数据和每列的值。或许我可以将它们保存为独立的实体完全。

I was previously using a simple DataTable to populate the main grid data, but I'm going to need something more complex to hold both the grid data and the values for each column. Or perhaps I can store them as separate entities entirely.

所以,没有任何人有我怎么可能拉断这个绑定任何想法?一个限制是,列必须是自动生成的,因为我不知道他们是什么,直到运行时。应用程序只加载数据形成一个Excel US preadsheet并且可以有任意数量的列present。

So, does anyone have any idea of how I might pull off this binding? One limitation is that the columns must be auto-generated since I have no idea what they will be until runtime. The application simply loads the data form an Excel spreadsheet and there may be any number of columns present.

谢谢,布赖恩

Thanks, Brian

推荐答案

下面是我落得这样做与MVVM模式使用此:

Here's what I ended up doing to use this with the MVVM pattern:

我有两组数据在我的视图模型绑定:一个用于实际的网格数据,一个用于列标题。目前,这些被公开为两个属性:

I have two sets of data for binding on my view model: one for the actual grid data and one for the column headers. Currently these are exposed as two properties:

// INotifyPropertyChanged support not shown for brevity public DataTable GridData { get; set; } public BindingList<ImportColumnInfo> ColumnData { get; set; }

诀窍与数据的两个不同的工作组是在网格中。我已经子类的DataGrid和给定的网格称为ColumnSource额外的数据源,依赖项属性。这是绑定到ColumnData我的视图模型。我那么每个自动生成的列的标题设置为在ColumnSource数据源中的适当索引的数据。在code是如下:

The trick to working with two differing sets of data is in the grid. I have subclassed the DataGrid and given the grid an additional data source called ColumnSource, as a dependency property. This is what is bound to the ColumnData on my view model. I then set the header of each auto-generated column to the appropriately indexed data in the ColumnSource data source. The code is as follows:

public class ImporterDataGrid : DataGrid { protected override void OnAutoGeneratingColumn(DataGridAutoGeneratingColumnEventArgs e) { base.OnAutoGeneratingColumn(e); int columnIndex = this.Columns.Count; var column = new ImporterDataGridColumn(); column.Header = ColumnSource[columnIndex]; column.Binding = new Binding(e.PropertyName) { Mode = BindingMode.OneWay }; e.Column = column; } public IList ColumnSource { get { return (IList)GetValue(ColumnSourceProperty); } set { SetValue(ColumnSourceProperty, value); } } public static readonly DependencyProperty ColumnSourceProperty = DependencyProperty.Register("ColumnSource", typeof(IList), typeof(ImporterDataGrid), new FrameworkPropertyMetadata(null)); }

我现在可以进行正常的数据在我的专栏的模板头,结合这都将结合对在我看来模型的ColumnData属性的数据。

I can now perform normal data binding in the templated header of my columns, which will all bind against the data in the ColumnData property of my view model.

更新:我被要求出示我的网格XAML。这真的很基本的,但在这里它是:

UPDATE: I was asked to show the XAML for my grid. It's really basic, but here it is:

<Controls:ImporterDataGrid AutoGenerateColumns="True" x:Name="previewDataGrid" VerticalScrollBarVisibility="Visible" HorizontalScrollBarVisibility="Visible" IsReadOnly="True" SelectionMode="Extended" HeadersVisibility="Column" ItemsSource="{Binding PreviewData}" ColumnSource="{Binding PreviewColumnData}" Style="{StaticResource ImporterDataGridStyle}" Background="White" CanUserReorderColumns="False" CanUserResizeRows="False" CanUserSortColumns="False" AlternatingRowBackground="#FFFAFAFA" AllowDrop="True" />

这里是ImporterColumnHeaderStyle:

And here is the ImporterColumnHeaderStyle:

<Style x:Key="ImporterDataGridColumnHeaderStyle" TargetType="{x:Type toolkit:DataGridColumnHeader}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type toolkit:DataGridColumnHeader}"> <Grid> <toolkit:DataGridHeaderBorder Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}" IsClickable="{TemplateBinding CanUserSort}" IsHovered="False" IsPressed="False" SortDirection="{TemplateBinding SortDirection}"> <Grid> <CheckBox Height="16" Margin="6,6,16,0" Name="importCheckBox" IsChecked="{Binding Path=Import}" VerticalAlignment="Top">Import Column</CheckBox> <StackPanel IsEnabled="{Binding Path=Import}"> <ComboBox Height="24" Margin="6,29,6,0" Name="columnTypeComboBox" VerticalAlignment="Top" SelectedValue="{Binding ColumnType}" ItemsSource="{Binding Source={local:EnumList {x:Type Models:ImportColumnType}}}"> </ComboBox> <TextBox Height="23" Margin="6,6,6,33" Name="customHeadingTextBox" VerticalAlignment="Bottom" Text="{Binding Path=CustomColumnName}" IsEnabled="{Binding ColumnType, Converter={StaticResource ColumnTypeToBooleanConverter}}" /> </StackPanel> <TextBlock Height="20" Margin="6,0,6,7" Name="originalHeadingTextBlock" Text="{Binding Path=OriginalColumnName}" VerticalAlignment="Bottom" Foreground="Gray" /> </Grid> </toolkit:DataGridHeaderBorder> <Thumb x:Name="PART_LeftHeaderGripper" HorizontalAlignment="Left"> <Thumb.Style> <Style TargetType="{x:Type Thumb}"> <Setter Property="Width" Value="8"/> <Setter Property="Background" Value="Transparent"/> <Setter Property="Cursor" Value="SizeWE"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type Thumb}"> <Border Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}"/> </ControlTemplate> </Setter.Value> </Setter> </Style> </Thumb.Style> </Thumb> <Thumb x:Name="PART_RightHeaderGripper" HorizontalAlignment="Right"> <Thumb.Style> <Style TargetType="{x:Type Thumb}"> <Setter Property="Width" Value="8"/> <Setter Property="Background" Value="Transparent"/> <Setter Property="Cursor" Value="SizeWE"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type Thumb}"> <Border Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}"/> </ControlTemplate> </Setter.Value> </Setter> </Style> </Thumb.Style> </Thumb> </Grid> </ControlTemplate> </Setter.Value> </Setter> </Style>

更多推荐

WPF的Datagrid绑定的自定义列标题

本文发布于:2023-11-08 07:44:56,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1568770.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:自定义   绑定   标题   WPF   Datagrid

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!