使用View Model将数据表绑定到DataGrid

时间:2013-10-09 09:02:58

标签: wpf datagrid

我有一个要求,我需要按原样显示DataTable的数据,即不需要对单元格进行编辑。另一个要求是我需要将Combobox显示为每列的标题。 其次,第一列需要是checkbox,检查哪一行是灰色的。我认为DataGrid应该是可行的,但我不确定,因为我无法找到办法。

可以请有人帮帮我。请注意,我希望以MVVM方式执行此操作,而不是在xaml.cs中编写代码

热切期待回应。

提前致谢。

编辑:代码虽然增加不多...... 的.xaml

<DataGrid HorizontalAlignment="Left" Margin="0,274,0,0" VerticalAlignment="Top" Height="321" Width="981" AutoGenerateColumns="True" ItemsSource="{Binding Path=UploadedProductData, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}">
            <DataGrid.Columns>
                <DataGridTemplateColumn CanUserReorder="False" CanUserResize="False">
                    <DataGridTemplateColumn.HeaderTemplate>
                        <DataTemplate>
                            <ComboBox HorizontalAlignment="Right" VerticalAlignment="Top" Width="100"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.HeaderTemplate>
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock HorizontalAlignment="Left" TextWrapping="Wrap" Text="" VerticalAlignment="Top"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>

在主窗口的视图模型中 -

DataTable _uploadedProductData;
        public DataTable UploadedProductData
        {
            get { return _uploadedProductData; }
            set 
            {
                _uploadedProductData = value; 
            }
        }

以上是财产。

在xaml.cs中 - 我设置了上面的属性 - 在一些按钮事件

 ViewModel.UploadedProductData = dt;

1 个答案:

答案 0 :(得分:0)

您在要求中声明的所有内容都完全可以在WPF中使用。 WPF可以实现大多数功能。现在您已经提供了一些代码,我可以看到您缺少所需的INotifyPropertyChanged界面...单击链接以获取此帮助。您需要实现此功能,以便在属性值更改后更新UI ...您是否看到包含代码示例的方式已经为您工作了?

确实可以创建DataTemplate来定义Header DataGrid部分中显示的内容。您可以将DataTemplate视为特定数据的微小视图,并且可以使用DataTemplate属性将Header设置为DataGrid.RowHeaderTemplate,因为您几乎已经获得了:

<DataGrid>
    <DataGrid.RowHeaderTemplate>
        <DataTemplate>
            <!--Define how you want the header to look here-->
        <DataTemplate>
    </DataGrid.RowHeaderTemplate>
</DataGrid>

现在,当涉及到绑定到单元格时,它实际上取决于您正在使用的对象。在WPF中,通常(但不是强制性的)创建准确表示数据的数据类型对象。在您的情况下,我将假设您将只使用您的DataTable对象,因此列名称很重要。

最好使用DataGridTextColumn列来显示文字, 也可以选择使用DataGridTextColumn.HeaderTemplate,如果您希望Header成为<DataGrid.Columns> <DataGridTextColumn Binding="{Binding Path=ColumnName0}"> <DataGridTextColumn.HeaderTemplate> <ComboBox HorizontalAlignment="Right" VerticalAlignment="Top" Width="100"/> </DataGridTextColumn.HeaderTemplate> </DataGridTextColumn> <DataGridTextColumn Header="First Name" Binding="{Binding Path=ColumnName1}" /> <DataGridTextColumn Header="Last Name" Binding="{Binding Path=ColumnName2}" /> </DataGrid.Columns> 不同列的不同之处:

ComboBox.ItemsSource

现在我猜你接下来要问如何填充{{1}}项目集合,但我已经没时间了。为此,我会将您推荐到WPF ComboBox in DataGridTemplateColumn with alternate ItemsSource帖子并说如果这对您没有帮助,您可以通过互联网搜索轻松找到此信息。